本指南会对nginx进行基本的介绍并描述一些它可以完成的简单任务。如果你还没有安装nginx,请参阅本指南不仅描述了怎么启动和停止nginx,怎么重新加载nginx的配置,还解释了nginx配置文件的结构以及如何设置nginx提供静态资源,还会教你如何将nginx配置为一个代理服务器,以及如何将它和FastCGI应用连接。
nginx有一个主进程和其它的工作进程。主进程的主要作用是读取解析配置,以及维护工作进程。实际处理请求的是工作线程。nginx采用基于事件模型和依赖于操作系统的机制来高效通过工作进程分发请求。工作进程的数量在配置文件中定义,它可以通过给定的配置固定,也可以通过CPU内核的数量自动调整。
nginx及其模块的工作方式通过配置文件确定。默认的配置文件名为nginx.conf ,放置在 /usr/local/nginx/conf
, /etc/nginx
, 或者/usr/local/etc/nginx
目录下。
启动,停止和重新加载配置
执行nginx的可执行文件来启动nginx。nginx启动后,可以通过执行nginx命令加上 -s
参数来控制。使用一下的语法:
nginx -s signal
可以使用以下的参数:
stop
— 快速停止quit
— 优雅地停止reload
— 重新加载配置文件reopen
— 重新打开日志文件
例如,要等待工作进程完成当前的请求工作之后停止nginx,可以执行以下的命令:
nginx -s quit
你需要用启动nginx的用户来执行这个命令 。
只有重新加载配置或者重新启动nginx之后,配置文件的更改才会生效。重新加载配置文件,可以执行:
nginx -s reload
一旦主进程收到重新加载配置的信号,它将检查新配置文件的语法是否正确,并尝试应用其中提供的配置。 如果成功,主进程启动新工作进程并向旧工作进程发送消息,要求它们关闭。如果失败,主进程将回滚更改并继续使用旧的配置。 旧工作进程接收到关闭的命令后,停止接受新连接并继续服处理当前请求,直到当前所有请求处理完成之后,旧工作进程退出。
在Unix工具(如 kill
工具 )的帮助下,也可以向nginx进程发送信号。 在这种情况下,一个信号被直接发送到指定进程ID的进程。 默认情况下,nginx主进程的进程ID被写入 /usr/local/nginx/logs
或者 /var/run
目录下的 nginx.pid
文件中。例如,如果主进程ID为1628,要发送退出信号让nginx优雅地关闭,执行:
kill -s QUIT 1628
可以使用 ps
工具来获取所用运行中nginx进程。例如,使用下面的语句:
ps -ax | grep nginx
有关nginx信号相关的更多信息,
配置文件的结构
nginx包含由配置文件中指定的指令控制的多个模块。指令分为简单指令和块指令。一个简单的指令由名称和参数(由空格分隔)组成,以分号(;)结尾。块指令具有与简单指令相同的结构,但它不是以分号结尾,而是以一组由大括号({和})包围的附加指令结束。如果一个块指令可以在大括号中包含其他指令,则称为上下文
如果一个指令放在配置文件中任何上下文之外,这个指令都被认为是在上下文中。events
和http
指令都属于主上下文, server
指令属于 http
上下文, location
指令属于 server
上下文。
#号之后的内容是注释。
提供静态内容
web服务器的一个重要任务是分发展示文件(如图像或静态HTML页面)。你可以实现一个示例:根据不同的请求,将从不同的本地目录提供文件:/data/www
(其中可能包含HTML文件)和 /data/images
(其中包含图像)。这将需要编辑配置文件,并在http块中设置一个server块,server块中包含两个location块。
首先,创建 /data/www
目录并放入一个包含任何文本内容的index.html
文件 ;然后创建 /data/images
目录,在其中放置一些图片资源。
接下来,打开配置文件。默认的配置文件已经包含了 server 块的几个示例,大部分都被注释掉了。现在注释掉所有这些块指令并编写一个新的server块指令:
http { server { } }
通常,配置文件可能包括多个server
块,这些 server
一旦nginx决定哪个server
进程处理请求,它就会根据 server
块中定义的 location
指令的参数测试请求头中指定的URI。
将以下 location
块添加到 server
块中:
location / { root /data/www; }
这个 location
块指定 “/” 前缀与请求的URI进行比较。为了匹配请求,URI将被添加到指令中指定的路径,即 /data/www ,以组装成本地文件的请求路径。如果有多个匹配的 location
块,nginx会选择匹配前缀最长的一个。上面的
location
块使用的前缀是最短的前缀(长度为1),因此只有当其它所有 location
块都不能匹配上时,才会使用这个。
接下来,添加第二个 location
块:
location /images/ { root /data; }
这个 location
块将会匹配以 /images/
开始的请求( location /
也会匹配这样的请求,但是它的前缀更短,优先级更低)。
server
块的最终配置应该是这样的:
server { location / { root /data/www; } location /images/ { root /data; } }
这已经是一个可以工作的服务器配置,它监听标准的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尚未启动,启动它,假如nginx已经启动,
发送 reload
信号给nginx的主进程,方法如下:
nginx -s reload
如果nginx没有像预期的那样工作,您可以尝试通过分析存放在
/usr/local/nginx/logs
或者/var/log/nginx
目录下的access.log
和error.log
日志文件来找出原因。
设置一个简单的代理服务器
nginx的常见用途之一是将其设置为代理服务器,这意味着代理服务器接收请求,并将它们传递给被代理的服务器,然后从被代理的服务器取得响应,并将它们发送给客户端。
我们将配置一个基本的代理服务器,它使用本地目录中的文件为图像请求提供服务,并将所有其他请求发送到被代理的服务器。在本例中,两个服务器将在同一个nginx实例上定义。
首先,向nginx的配置文件中添加一个 server
块来定义被代理的服务器,其内容如下:
server { listen 8080; root /data/up1; location / { } }
这是一个监听8080端口的简单服务器(之前默认监听80端口可以不使用 listen
指令 ,这次使用listen
指令来指定监听的端口是因为标准的80端口已经被占用了),它将所有请求映射到本地文件系统上的 /data/up1
目录。在本地创建这个目录并放入 index.html
文件。注意,这种 root
指令是放在 server
的上下文中。当匹配上请求的 location
块不包含自己的 root
指令时,会使用这种 root
指令。
接下来,使用上一节中的服务器配置并将其修改为代理服务器配置。在第一个 location
块中,参数中指定协议、被代理服务器的名称和端口 (在本例中是 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
块,然后检查正则表达式。如果与正则表达式匹配,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,让nginx重新加载配置。
你可以点击来查看进一步配置代理连接可能用到的指令。
设置FastCGI( 快速通用网关接口 )代理
nginx可用于将请求路由到FastCGI服务器,FastCGI 可以运行多种框架和编程语言(如PHP)构建的应用程序。
使用FastCGI服务器最基本的nginx配置包括使用指令来设置传递给FastCGI服务器的参数。假设FastCGI服务器可以在 localhost:9000
上访问。以上一节中的代理配置为基础,将 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; } }
通过以上的配置,设置了一个服务器,这个服务器通过FastCGI协议将除静态图像请求之外的所有请求路由到在 localhost:9000
上操作的被代理服务器。