写给Web开发人员看的Nginx介绍

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

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

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

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

初始化安装

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

查找nginx目录

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

注意: 在该目录下会发现一个 /etc/nginx/sites-available 的文件夹。这个文件夹通常在你须要创建和管理多个站点的时候很是有用,能够帮助你更好的组织不一样的项目。你须要在这里添加你的nginx配置文案并将他们连接至 sites-enabled 目录下。命令以下:浏览器

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

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

配置静态服务器

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

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/