译者注:不知道其他开发者是否和我一样,参与或者写了很多Web项目,但是却没有真正的去完整的部署应用,很多时候都是交给ops即运维的同学帮忙来做。而作为一个有节操的开发者,我认为了解一些服务器方面的知识是很有必要的,读了这篇文章之后,自己对nginx也有了一个初步的认识,对自己很有帮助,不敢独享,遂译之。

如果你是一名Web开发人员,那么你很有可能听过nginx(读音听起来像engine-x). Nginx是一款速度快,功能强大的http以及反向代理服务器,经过简单的配置之后即可以用来托管页面。

不幸的是,和很多其他系统管理工具一样,相关的原理教程和配置说明文档都很少。虽然官方提供了一个wiki,但是内容多且复杂,却没有真正的介绍那些你可能真正需要的东西。在自己纠结这个wiki一段时间之后,我终于掌握了使用nginx的一些基础知识,并把它们在这里与其他开发者分享出来,希望你们能够更加快速的去掌握这些知识。

下面进入正题。针对本教程,你需要一个VPS(虚拟主机),最好是刚刚建立的,这样可以避免与先前的配置产生冲突。

初始化安装

现在假设你已经拥有一个运行ubuntu的虚拟主机(比如说托管于 digital ocean),配置好登录选项并更新好 apt 之后,运行 apt-get install nginx 安装nginx.在浏览器访问你的IP地址,你会看到页面显示“welcome to ngnix”信息。OK,一切正常。

查找nginx目录

在我们通过 apt 安装完nginx后,它为我们提供了一个基本的结构,帮助我们迅速设置好配置文件。所有的nginx配置文件都在 /etc/nginx下(译者注:Mac OS X环境下使用homebrew路径与linux有区别,文章结尾部分提供mac下解决方案),输入 cd 进入该目录。你需要添加新配置选项的地方位于 sites-enabled 文件夹。如果你打开这个文件夹,你会发现一个名为 default 的txt文档,打开后你就会找到nginx的配置选项以及 “welcome to nginx"欢迎选项的代码。接下来我们开始建立属于我们自己的配置文件用于显示一个页面。在sites-enabled目录下新建一个空白文件并命名为 test,用你自己喜欢的文本编辑器进行编辑。

注意: 在该目录下会发现一个 /etc/nginx/sites-available 的文件夹。这个文件夹一般在你需要建立和管理多个站点的时候非常有用,可以帮助你更好的组织不同的项目。你需要在这里添加你的nginx配置文案并将他们链接至 sites-enabled 目录下。命令如下:

ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/dotcom

只有在 sites-enabled 目录下的配置文件才能够真正被用户访问。但是你同样可以将文件放在 sites-available 目录下用来存档或者生成链接。

配置静态服务器

Nginx配置文件有自己的格式,好消息是文件的格式相当简单,看起来特别像CSS文件,先指定变量名,然后在花括号内编写指令。最顶层是 server ,代码为:

server {

}

在花括号内,我们仍然可以像书写CSS一样,键值对后接分号,或者说更像sass的语法,并添加嵌套代码块。后面两种风格的代码我们都会用到,也很容易理解。

这里可以添加的键值对和代码块(在本教程的后面我们把它称为指令)有很多种,你可以转到官方文档去具体查看。对于基本的服务器设置其实只用掌握一些重要的指令即可。我会给后面的每个指令链接官方的ngnix文档。官方文档是你深入理解nginx的唯一渠道,因此你必须掌握如何更好的去使用它。

listen

声明服务器监听的端口号。如果你了解rails,你一定知道本地服务器的默认端口是3000. Roots运行在1111端口。SSL在443端口。互联网的默认端口是80,因此在url中未定义端口的话一般默认为80。因为你很有可能是去运行一个线上的服务器,因此最好定义成80端口。代码如下:

server {
listen 80;
}

注意默认端口严格来讲不是必要的,但是为了能够保证你对整个流程足够了解最好加上。完成了第一步,我们进入下一步server_name.

server_name

server_name主要用来匹配url地址。任意请求通过nginx时,它会查看url并寻找 server_name 片段。如果你的站点地址为 http://xvfeng.me, 那么你的 server_name 应当也为 xvfeng.me . 如果你在域名解析时使用了A记录并通过服务器指向 http://snargles.com , 你可以添加另外一个 server 代码,将 server_name 指向 snargles.com, 这段代码就会匹配来自于这个域名的请求。

这个特性非常强大。这意味着你可以在单个nginx配置文件里托管无数个站点,甚至包括不同域名的网站。你需要做的只是将设置A记录并指向虚拟机所在的IP, 之后设置其他的nginx服务器配置。

针对 server_name 还有两点值得关注。首先是你可以设置子域名。如果你想匹配http://test.example.com ,设置相当简单,甚至还可以指向一个完全不同的应用。第二点,你可以使用通配符, 即 * 或者正则来匹配路由。这个功能绝对强大。下面我们简单的配置一下server_name到example.com .

server {
listen 80;
server_name example.com;
}

Nice.接下来再加一些配置就可以让服务器运转了。

root

这个是托管静态站点最关键的部分。如果你只是想用它来托管一些html和css文件,root部分要定义的就是这些文件存放的路径。我喜欢把文件放在 /var/www 目录下,因此我们在这里建立一个文件夹。使用 mkdir 创建 /var/www/example 目录,建立一个空白的 index.html 文件,随便添加一些段落输出hello world之类的内容。代码如下:

server {
listen 80;
server_name example.com;
root /var/www/example;
}

基本变量设置完毕,下一步配置路由。

location

Location接受两个参数,一个字符串或者正则和一段代码。字符串或者正则用于匹配某个特定目录。如果你想让用户在访问 example.com/whaterver 时访问某个特定页面,你需要将 whatever 设置为uri地址。在这里我们只需要访问root目录,因此只需要加上 / 即可,内容暂时为空,后面再做解释。

server {
listen 80;
server_name example.com;
root /var/www/example; location / { }
}

第一参数可以有很多种写法,你可以参考上面给出的链接。在以上区块内,我们需要路由指向结果页面。注意 / 会匹配所有的url地址,因为在这里它被解释为一个正则。如果你只想匹配某个准确的字符串,只需要在前面加上一个等号,写法如下:

location = / { ... }

现在我们需要完成之前的代码。我们可以在区块内添加另外一段指令,用于加载名为 try_files 的文件。Try fiels接受了一组文件名或者正则,用于在根目录下查找,并会加载查找到的第一个结果。对于我们的静态服务器来讲,我们希望找到一个在 / 之后紧跟着whatever的文件,例如 whatever.html. 如果在斜线后面没有任何内容,则会寻找 index.html. 在上面给出的文档链接中你可以找到更多的关于如何设置该选项的吸纳关系介绍,这里我们只写一些简单的配置:

server {
listen 80;
server_name example.com;
root /var/www/example; location / {
try_files $uri $uri/ /index.html;
}
}

你可能会奇怪上面的 $url 是从哪里来的?其实是nginx所提供的。每次有请求时,nginx会生成一系列变量,这些变量存储了请求的相关信息。这里的uri就是我们将要了解的内容之一。

  • 来自 http://example.com 的请求进入。
  • nginx找到server片段代码,其中 server_name 为 example.com ,并使用它来处理请求
  • nginx匹配任意请求。因为这里的 / 会匹配根域名下的任意内容。
  • 在匹配到的location代码中,nginx开始试图加载一个文件。首先寻找一个未命名的文件,因为这里的uri匹配的就是没有名称的文件,所以无法找到。接着开始查找未命名的目录,结果还是找不到。最后开始查找并加载根目录下 /index.html 。

接下来想象一下如果你添加一个名为 test.html 的文件到根目录下并访问 http://example.com/test.html.自己试一下你就知道了。

你可以任意的去尝试改变这里的配置环境。例如,在carrot.is这个网站里,但用户访问某个文件并且没有加上 .html 后缀时,try_files同样会查找 $uri.html 并匹配相应结果。因此在你访问http://carrot.is.about 和 http://carrot.is/about.html 时你会得到相同的文件。你可以充分发挥你的想象力去设置你的配置文件。

启动服务

总结一下我们所做的事情。首先添加了 server 选项,在nginx运行时,会查找 /etc/sites-enabled 目录下的所有配置文件用于显示对应内容。但是请等一下,你可能无法马上得到结果-因为nginx并不知道你所作的这些改动。为了让nginx真正读取新配置文件,你需要重启服务器,运行以下命令:

service nginx reload

注意:这里的 service 命令实际上是调用了配置文件里内容,这些都在使用 apt 时被生成。这里调用的实际上是 /etc/init.d/nginx reload .

接下来就是访问服务器IP地址便可得到你想要的页面。

Mac OS X下参考文档:Installing Nginx in Mac OS X Mountain Lion With Homebrew

原文链接: http://carrot.is/coding/nginx_introduction

转载请注明出处: http://xvfeng.me/posts/Nginx-for-developers/

写给Web开发人员看的Nginx介绍的更多相关文章

  1. 写给Android App开发人员看的Android底层知识(1)

    这个系列的文章一共8篇,我酝酿了很多年,参考了很多资源,查看了很多源码,直到今天把它写出来,也是战战兢兢,生怕什么地方写错了,贻笑大方. (一)引言 早在我还是Android菜鸟的时候,有很多技术我都 ...

  2. Web开发人员常犯的10个错误

    说到开发一个运行在现代网络中的网站:Web开发人员需要选择虚拟主机平台和底层数据存储,准备编写HTML.CSS和JavaScript用的工具,要有设计执行方式,以及一些可用的JavaScript库/框 ...

  3. 作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的

    前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章>,其中大多数是E文的. 先译其中一篇web相关的”每个程序员必知之WEB开发”. 原文: http://programme ...

  4. 成为Web开发人员的7个简单步骤

    你想成为一名 Web 开发人员,但现在你面前有这样一个问题,那就是你没有在高科技行业工作的经验.你上了一些课程,也花了时间在个人编码项目上,但是你的简历上关于“经验”的部分仍然不为企业承认.过渡到一个 ...

  5. web开发人员

    随笔- 4  文章- 18  评论- 12  [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的   前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章> ...

  6. 作为Web开发人员,我为什么喜欢Google Chrome浏览器

    来源: http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html 在Google Chrome浏览器出来之前,我一直使用FireF ...

  7. [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的

    前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章>,其中大多数是E文的. 先译其中一篇web相关的”每个程序员必知之WEB开发”. 原文: http://programme ...

  8. Web开发人员必读的12个网站

    The more you actually create, the more you’ll learn.(创造的越多,学习的越多),世界上有无数个开发人员会在网上分享他们的开发经验,我们无法向所有人学 ...

  9. Web 开发人员不能错过的 jQuery 教程和案例

    jQuery 把惊喜延续到设计领域,处处带来极大的灵活性,创造了许多体验良好的设计,而且拥有不错的性能.这里分享一组 Web 开发人员不能错过的 jQuery 教程和案例,帮助你更好的掌握 jQuer ...

随机推荐

  1. 了解有关 in_memory 工作空间的详细信息

    ArcGIS 提供了一个可写入输出要素类和表的内存工作空间.作为将地理处理输出写入磁盘上的某个位置或网络位置的备选方案,可将输出写入内存工作空间中.通常,将数据写入内存工作空间要明显快于写入其他格式( ...

  2. Flutter移动电商实战 --(53)购物车_商品列表UI框架布局

    cart_page.dart 清空原来写的持久化的代码; 添加对应的引用,stless生成一个静态的类.建议始终静态的类,防止重复渲染 纠正个错误,上图的CartPage单词拼错了,这里改过来防止后面 ...

  3. 解决com.android.support版本冲突问题

    原文:https://www.jianshu.com/p/0fe985a7e17e 项目中不同Module的support包版本冲突怎么办? 只需要将以下代码复制到每个模块的build.gradle( ...

  4. 【转载】 什么是P问题、NP问题和NPC问题

    原文地址: http://www.matrix67.com/blog/archives/105 转载地址: https://www.cnblogs.com/marsggbo/p/9360324.htm ...

  5. Qt编写自定义控件42-开关按钮

    一.前言 从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在Qt ...

  6. 【Leetcode_easy】693. Binary Number with Alternating Bits

    problem 693. Binary Number with Alternating Bits solution1: class Solution { public: bool hasAlterna ...

  7. Flutter 踩坑之build函数返回了null

    今天遇到一个bug,内容都正常显示没问题,但是控制台里报错,如图: 翻译了下,说是函数不能返回空值,搜索了下,网上相同问题的是少写了个return,我检查了下也没发现少return的,后来突然发现if ...

  8. leetCode:twoSum 两数之和 【JAVA实现】

    LeetCode 两数之和 给定一个整数数组,返回两个数字的索引,使它们相加到特定目标. 您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素. 更多文章查看个人博客 个人博客地址:t ...

  9. 最新 中至数据java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.中至数据等10家互联网公司的校招Offer,因为某些自身原因最终选择了中至数据.6.7月主要是做系统复习.项目复盘.Leet ...

  10. CenOS 7 java链接redis数据库

    完整代码 public class App { public static void main(String[] args) { System.out.println("Hello Worl ...