Nginx 官方文档翻译 - 新手指南
介绍
Nginx 官方文档 : http://nginx.org/en/docs/
安装Nginx
参考:nginx 集群系列 - Nginx安装及编译选项说明
新手指南
本指南提供了一个关于nginx基本介绍并描述了一些可以用它完成的简单的任务。我们假设nginx已经安装在读者的电脑上。如果还未安装请安装。本指南描述如何启动、停止和重启它的配置文件,解释了配置文件的结构并描述了如何设置nginx如何服务静态内容、如何配置nginx作为一个代理服务器以及如何将它与FastCGI应用连接。
nginx有一个主进程和多个工作进程。主进程的目的是为了读取和评估配置并保持工作进程。工作进程则做请求的实际处理。nginx采用基本的事件模型和操作系统依赖性机制来有效地分配工作进程之间的请求。工作进程的数量可以在配置文件中定义,也可以给出一个固定值,又或者调节到CPU内核可用的数量。参阅:worker_processes
nginx 和它的模块工作方式是在配置文件中定义的。默认情况下,这个配置文件名为nginx.conf,放置在/usr/local/nginx/conf,/etc/nginx或者/usr/local/etc/nginx目录。
启动、停止和重启加载配置
要启动nginx,运行可执行文件。一旦nginx被启动,它可以通过调用-s参数来执行控制。使用一下命令:
nginx -s signal
其中signal可能是以下选项:
- stop — 快速关机
- quit — 正常关机
- reload — 重新加载配置文件
- reopen — 重新打开日志文件
例如要等待运行中的nginx进程处理完目前的请求后,再停止nginx进程。可以执行命令如下:
nginx -s quit
该命令应该是在启动nginx的同一用户下执行。
配置文件修改后,直到重新加载配置或重新启动nginx才会生效。 重新加载配置,可执行命令:
nginx -s reload
一旦主进程接收到信号重新加载配置文件,它会检查新配置文件语法的合法性并尝试应用。 如果成功,主进程会开启新的工作进程,并发送消息告诉旧的工作进程,请求他们快速停止。反之,主进程会回滚配置文件修改的部分,继续使用旧的配置。旧的工作进程接收到快速停止的命令后, 会停止接受新的连接请求,它会继续服务当前的请求直到请求被服务结束。在那之后,旧的进程会退出。
同时,一个信号也可以在Unix工具的帮助下传送到nginx进程,如kill工具。 在这种情况下,该信号可以被直接传送到指定进程ID(process ID)的进程。默认情况下,该nginx 主进程的process ID 被记录在/usr/local/nginx/logs或/var/run目录下的nginx.pid文件。例如,主进程ID是1628,可以发送“QUIT”信号来让nginx 关机,执行:
kill -s QUIT 1628
获取所有运行nginx进程列表,可以使用ps 工具。例如,以下方式:
ps -ax | grep nginx
想知道更多有关nginx通信的信息,可查看Controlling nginx。
配置文件结构
nginx 所包含的模块控制指令在配置文件中指定。指令被分为简单指令和块指令。简单指令包括名称和用空格分割的参数以及用来结尾的分号(;)。一块指令具有简单指令相同的结构,但它以一组指令括号“{”和“}”包围,而不是以分号结尾。如果块指令的括号内有其他指令,它被称为上下文(如:events, http, server, and location)。
放在配置文件最外面的指令的称之为主文(main context主文,即没有被上下文包含的上下文)。event和http指令是主文,server位于http内, location位于server内。
以”#”开头的行是注释。
提供静态内容
Web服务器一个重要的任务就是提供文件(如图像或者静态html页面)。 根据需求,你将实现一个例子,文件被本地不同的目录服务着,如/data/www 包含html文件,/data/images 包含图片。这需要编辑配置文件,在http块中设置server块。
首先,创建/data/www 目录并放置index.html文件(文件中可以是任意内容)。 然后创建/data/images目录并放置一些图片。
接下来,打开配置文件。默认的配置文件已经包含了几个server块的例子,大多数都被注释掉了。 现在注释掉所有的块,并开始一个新的server块。
http {
server {
}
}
一般情况下,配置文件中包含多个server块,它们之间以监听的端口号和server name来区分。 一旦nginx决定了哪个server处理请求,它会对比请求头中指定URI和server中location的参数。
将location块添加到server块中,如下:
location / {
root /data/www;
}
与请求的URI相比,location块指定了“/”前缀。为了匹配请求,该URI会被添加到root指令指定的路径中, 即到/data/www,在本地文件系统中组成请求文件的路径。如果有多个location块都匹配了请求,nginx会选择前缀最长的一个。上面的location块提供了最短的前缀,长度为一,所以只有其他全部location块都不匹配的时候,这个块才会被使用。
接下来添加第二个location块:
location /images/ {
root /data;
}
它会匹配所有以/images/开头的请求(location / 也匹配这个请求,但是前缀更短)
最终的server块的配置如下所示:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这已经是一个可以工作的server配置,监听标准80端口,在本机可以访问http://localhost/进行访问。为响应以/images/作为URI开头的请求,服务器会从/data/images目录读取文件。例如,为了响应http://localhost/images/example.png请求,nginx会提供/data/images/example.png文件。如果这个文件不存在,nginx会发送一个指示404错误的响应。不以/images/开头的请求会被映射到/data/www目录。例如,为响应http://localhost/some/example.html 请求,nginx会发送/data/www/some/example.html文件。
为了使新的配置生效,如果nginx还没启动,请启动,或者想nginx主线程发送reload信号,执行:
nginx -s reload
一旦有什么与预期不符的事情,你可以尝试在access.log和error.log文件中查找原因,它们在/usr/local/nginx/logs或者/var/log/nginx目录下面。
搭建一个简单的代理服务器
Nginx的一个常见用途是设置为代理服务器,所谓代理,就是接收客户端请求,然后传递给被代理的服务器并获得响应,再返回给客户端。
我们将要配置一个基本的代理服务器,它会用本地目录来响应所有的图片请求,其他请求都会转发给被代理的服务器。在这个例子中,服务器和代理服务器都用同一个nginx服务器实现。
首先,在nginx的配置文件中增加一个包含如下内容的server块,定义一个被代理的服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}
这是一个简单的服务器,监听8080端口(之前,listen指令没有指定,因为使用了标准80端口)并将所有请求映射到本地文件系统的/data/up1目录。 创建这个目录,把index.html文件放在目录下。注意,root指令被放在了server上下文。 如果被选中用来处理请求的location块没有自己的root指令,就会使用这个root指令。
然后,使用上一节使用的server配置,修改一下作为代理服务器配置。在第一个location块,加入一个proxy_pass指令,指明被代理服务器指定的协议、机器名、端口号(在本例中,使用了http://localhost:8080):
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
第二个location块,现在将/images/包含前缀的请求映射到/data/images目录下的文件,我们修改一下,让它匹配包含特定文件扩展名的请求。修改后的location块如下:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
参数是正则表达式,匹配所有以 .gif、.jpg或.png结尾的URI正则表达式需要前置一个~符号。请求会被映射到/data/images目录。
当nginx选择location块来处理请求时,它首先检查指定了前缀的location指令,记住有最长前缀的location,然后检查正则表达式。 如果有匹配的正则表达式,nginx选择这个location,否则,选择前面记住的那个location。
代理服务器的最终配置如下:
server {
location / {
proxy_pass http://localhost:8080/;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
此服务器会筛选出以.gif,.jpg,.png 结尾的请求,并将他们映射到/data/images目录下(通过添加URI到root指令的参数上), 然后通过所有其它请求到代理服务器配置上。
要应用最新的配置,就像上一节介绍的,发送reload指令给nginx主进程。
还有更多指令可以用作配置代理服务器。
设置FastCGI代理
nginx被用于指定request到用各种框架和例如php语言的程序的fastcgi服务器。
大多数基本的fastcgi的nginx配置用fastcgi_pass指令代替了proxy_pass 指令,并且fastcgi_param设置参数发送到fastcgi服务上,假设fastcgi服务是可以通过localhost:9000可以访问的,把前面内容的proxy配置文件作为一个基础。用fastcgi_pass指令代替proxy_pass 指令,并且设置proxy_pass为localhost:9000,在php中,SCRIPT_FILENAME 参数被用于确定脚本名称,QUERY_STRING 参数被用于传递request参数,最终的配置文件应该是:
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}
这个配置文件将把所有请求(除了静态图片的request)通过fastcgi协议 发送到运行localhost:9000的代理服务器。