初学者指南
启动、停止和重新加载配置 配置文件的结构 提供静态内容 设置一个简单的代理服务器 设置 FastCGI 代理 |
本指南对 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 -s quit
此命令应在启动 nginx 的同一用户下执行。
在配置文件中进行的更改将不会应用,直到将重新加载配置的命令发送到 nginx 或重新启动 nginx。要重新加载配置,请执行
nginx -s reload
主进程收到重新加载配置的信号后,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程,并向旧的工作进程发送消息,要求它们关闭。否则,主进程将回滚更改,并继续使用旧配置工作。旧的工作进程在收到关闭命令后,将停止接受新连接,并继续为当前请求提供服务,直到所有此类请求都得到服务。之后,旧的工作进程将退出。
还可以使用 Unix 工具(例如 kill
实用程序)向 nginx 进程发送信号。在这种情况下,信号将直接发送到具有给定进程 ID 的进程。默认情况下,nginx 主进程的进程 ID 会写入目录 /usr/local/nginx/logs
或 /var/run
中的 nginx.pid
。例如,如果主进程 ID 为 1628,要发送 QUIT 信号以导致 nginx 正常关闭,请执行
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
(包含图像)。这需要编辑配置文件并在 http 块内使用两个 location 块设置 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
块提供了最短的前缀,长度为一,因此只有当所有其他 location
块都无法提供匹配时,才会使用此块。
接下来,添加第二个 location
块
location /images/ { root /data; }
它将匹配以 /images/
开头的请求(location /
也匹配此类请求,但前缀较短)。
server
块的结果配置应如下所示
server { location / { root /data/www; } location /images/ { root /data; } }
这已经是服务器的一个工作配置,该服务器在标准端口 80 上监听,并且可以在本地计算机上的 https://127.0.0.1/
中访问。对于以 /images/
开头的 URI 的请求,服务器将发送来自 /data/images
目录的文件。例如,对于 https://127.0.0.1/images/example.png
请求,nginx 将发送 /data/images/example.png
文件。如果此类文件不存在,nginx 将发送指示 404 错误的响应。以 /images/
开头 URI 的请求将映射到 /data/www
目录。例如,对于 https://127.0.0.1/some/example.html
请求,nginx 将发送 /data/www/some/example.html
文件。
要应用新配置,请在以下情况下启动 nginx:如果 nginx 尚未启动,或者通过执行向 nginx 的主进程发送 reload
信号
nginx -s reload
如果某些内容未按预期工作,您可以在/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
指令),并将所有请求映射到本地文件系统上的 /data/up1
目录。创建此目录并将 index.html
文件放入其中。请注意,root
指令放置在 server
上下文中。当为处理请求而选择的 location
块不包含其自己的 root
指令时,将使用此类 root
指令。
接下来,使用上一部分中的服务器配置并对其进行修改,使其成为代理服务器配置。在第一个 location
块中,放置 proxy_pass 指令,其中包含参数中指定的代理服务器的协议、名称和端口(在本例中,它是 https://127.0.0.1:8080
)
server { location / { proxy_pass https://127.0.0.1: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
,否则,它将选择之前记住的那个。
代理服务器的结果配置如下所示
server { location / { proxy_pass https://127.0.0.1:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
此服务器将过滤以 .gif
、.jpg
或 .png
结尾的请求,并将它们映射到 /data/images
目录(通过将 URI 添加到 root
指令的参数中),并将所有其他请求传递到上面配置的代理服务器。
要应用新配置,请按照前几节所述向 nginx 发送 reload
信号。
还有许多 更多 指令可用于进一步配置代理连接。
设置 FastCGI 代理
nginx 可用于将请求路由到 FastCGI 服务器,该服务器运行使用各种框架和编程语言(例如 PHP)构建的应用程序。
与 FastCGI 服务器配合使用的最基本的 nginx 配置包括使用 fastcgi_pass 指令(而不是 proxy_pass
指令),以及 fastcgi_param 指令来设置传递给 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
上运行的代理服务器。