注:本文为nginx官网 Beginner's Guide 的译文。翻译不易,转载请注明。
本手册介绍了有关nginx的基础知识,并描述了nginx可以完成的几项简单任务。读者在阅读本手册前请确保自己的机器上已经安装好nginx。未安装好的读者可参考如何安装nginx。本手册将介绍以下内容:
- 如何启动、停止nginx
- 如何重新载入其配置文件
- nginx配置文件的结构
- 如何配置将nginx设置为静态资源服务器
- 如何将nginx设置为代理服务器
- 如何使nginx关联FastCGI应用
nginx拥有一个主进程和数个工作进程。主进程的主要任务是读取配置文件、评估配置文件的合理性和维护工作进程。工作进程的任务是处理具体的请求。nginx采用事件驱动模型和OS强相关机制确保能够高效地将请求分配给各个工作进程。工作进程的数量可在配置文件中设置,可以将数量定为某个数值,也可以使nginx按照CPU核心数自动调整。(见工作进程)
nginx和其各个模块的工作方式由配置文件决定。默认情况下,配置文件的名称为nginx.conf
,位于 /usr/local/nginx/conf
、 /etc/nginx
或/usr/local/etc/nginx
文件夹中。
启动nginx、停止nginx、重新载入配置文件
运行nginx可执行文件即可启动nginx。nginx启动后,可通过在nginx可执行文件后增加-s
参数来控制nginx服务器。语法如下:
nginx -s signal
signal为下列任一值:
-
stop
— 快速地关闭 -
quit
— 优雅地关闭 -
reload
— 重新载入配置文件 -
reopen
— 重新打开日志文件
例如,若要停止nginx各个进程,但停止之前须等待工作进程处理完当前的请求,则可运行以下命令:
nginx -s quit
执行该命令的用户应与启动nginx的用户一致
命令nginx重新载入配置文件或重启nginx之后,配置文件中做出的改变才会生效。运行以下命令即可命令nginx重新载入配置文件:
nginx -s reload
主进程收到重新载入配置文件的信号后,该进程会先检查新配置文件的语法,然后尝试应用其中提供的配置。若成功,主进程会启动新的工作进程,并向旧工作进程发送信息,要求其停止工作。若不成功,主进程回滚其做出的改变,继续使用旧配置。主进程收到停止命令后将不再接受新的连接,同时继续处理当前请求直至完成。之后,旧工作进程退出。
可以通过kill
命令之类的Unix工具向nginx进程发送信号。在这种情况下,信号会直接送至指定进程ID下的进程。nginx主进程的进程ID默认被写入/usr/local/nginx/logs
或/var/run
文件夹内的nginx.pid
文件。例如,假设主进程的ID是1628,若需要向nginx发送QUIT信号使其优雅关闭,则可执行以下命令:
kill -s QUIT 1628
若需要列出所有运行中的nginx进程,可与下面的方式使用ps
命令:
ps -ax | grep nginx
获取与向nginx发送信号相关的更多信息,访问控制nginx。
配置文件的结构
nginx由各个模块组成,这些模块由配置文件中的控制指令控制。指令分为简单指令和块指令。简单指令由名称、被空格隔开的参数、结尾的分号(;
)组成。块指令与简单指令的结构相同,但结尾不是分号,而是被花括号({
和 }
)括住的一组额外的指令。若块指令内可嵌套被花括号括住的其他指令,则可将该块指令称为一个上下文(events、http、server和location链接的网页给出了示例)。
在配置文件之内、各上下文之外定义的指令处于main上下文中。events
和 http
指令处于main上下文中,server
指令处于http
上下文中,而 location
指令则处于 server
上下文中。
以#
开头的行为注释行。
动静分离
web服务器的一大重要功能就是解析文件(比如图片或静态HTML页面)。在这里,你将实现一个示例配置,使服务器能够根据请求从不同的本地文件目录(例如:/data/www
(可能包含HTML文件)和/data/images
(包含图片))解析文件。为达到这个目的,你需要编辑配置文件,在包含两个location块的http块内配置一个server块。
首先,创建/data/www
文件目录,将包含文字内容的index.html
放置到该目录内。接着创建/data/images
目录,将几个图片文件放置到里面。
然后,打开配置文件。文件中的默认配置已经包含了几个示例server
块,不过大多数被注释掉了。目前先将所有这样的块指令注释掉,然后定义一个新的server
块:
http {
server {
}
}
一般来说,配置文件可包含数个server
块,各个块的端口和服务器名称 不同。一旦nginx确定了当前请求应该由那个server
处理,它会根据server
块中location
指令的参数比对请求头中的URI。
将下面的location
块写入server
块中:
location / {
root /data/www;
}
该 location
块规定应以/
前缀比对请求中的URI。若请求吻合,其中的URI将被拼接到root指令给出的路径后,即拼接到 /data/www
后,以生成被请求的文件在本地文件系统中的路径。如果匹配的 location
块有多个,nginx会优先选择前缀最长的那个。 上面给出的location
块定义的前缀长度为1,最短,因此只有在其他所有location
块都不匹配的情况下,nginx才会选择该location
块。
接着将第二个location
块写入server
块中:
location /images/ {
root /data;
}
该location
块将匹配以/images/
开头的请求(location /
也匹配这样的请求,但是其定义的前缀更短)。
此时,配置后的server
块是这样的:
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
这样就已经配置了一个可用的nginx服务器了,该服务器监听80端口,在本机可通过http://localhost/
访问。当请求中的URI以/images
开头时,服务器将从/data/images
目录解析文件。例如,对 http://localhost/images/example.png
请求进行回应时,nginx将返回/data/images/example.png
文件。如果该文件不存在,nginx将返回404错误。不以/images/
开头的URI将被映射到 /data/www
目录。例如,对http://localhost/some/example.html
请求,nginx将返回/data/www/some/example.html
文件。
启动nginx(若还未启动)或通过以下命令向nginx主进程发送reload
信号可使配置文件中所做修改生效:
nginx -s reload
若执行命令时出现错误,你可在
/usr/local/nginx/logs
或/var/log/nginx
的目录下的access.log
和error.log
文件中找到出错的原因。
搭建一个简单的代理服务器
nginx最广泛的应用场景就是代理服务器。代理服务器的工作流程通常是:接收请求、将请求转发给被代理的服务器、从被代理的服务器接收回应、将回应发送给客户端。
我们接下来将配置一个基础的代理服务器。若是图片请求,则该服务器会从本地目录解析文件,否则将会将请求发送给一个被代理的服务器。本示例中的两个服务器将在单个nginx实例中定义。
首先,在nginx的配置文件中增添一个server
块来充当被代理的服务器,server
块中的内容如下:
server {
listen 8080;
root /data/up1;
location / {
}
}
这样就配置好一台监听8080端口的服务器(之前因为使用了标准的80端口,所以不需要使用listen
指令),并将所有请求映射到本地文件系统的/data/up1
目录。创建该目录,然后将index.html
放到该目录中。注意,root
指令位于server
上下文中。若选中的location
块没有包含自己的root
指令,系统就会自动使用在server
上下文中定义的root
指令。
接下来,将上一节中用到的服务器配置修改为代理服务器的配置。在第一个location
块中加入proxy_pass指令,指令的参数中应声明代理服务器的协议、名称和端口。
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}
第二个 location
块指令目前将以/images/
开头的请求映射到/data/images
目录下的文件。我们将修改该指令,使其参数可以匹配带有典型图片文件扩展名的图片请求。修改后的 location
快是这样的:
location ~ \.(gif|jpg|png)$ {
root /data/images;
}
location
指令的参数是正则表达式,可匹配所有以 .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将请求路由到FastCGI服务器,在这种服务器上运行的程序通常由多种框架和编程语言(例如PHP)写成。
最基础的FastCGI服务器配置中会用到fastcgi_pass指令(而非proxy_pass
指令)以及fastcgi_param 指令(用于声明需传递给FastCGI服务器的参数)。假设可通过localhost:9000
访问FastCGI。以之前的代理服务器配置为模板,用fastcgi_pass
指令替代proxy_pass
指令,然后将fastcgi_pass
的参数指定为 localhost:9000
。在PHP中,SCRIPT_FILENAME
参数用于确定脚本名称,QUERY_STRING
参数用于传递请求参数。最终的配置文件将会是这样:
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;
}
}
这样就配置了一个可将所有请求(静态图片请求除外)路由到 localhost:9000
处使用 FastCGI协议的被代理服务器。
欢迎到 作者github主页交流