本指南对nginx进行了基本的介绍,并描述了一些可以使用它完成的简单任务。首先需要先安装 nginx。本指南描述了如何启动和停止nginx,并重新加载其配置,解释了配置文件的结构,并描述了如何设置nginx以提供静态内容,如何将nginx配置为代理服务器,以及如何将其与FastCGI应用程序连接。

nginx有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程对请求进行实际处理。nginx采用基于事件的模型和依赖于操作系统的机制,在工作进程之间有效地分配请求。工作进程的数量在配置文件中定义,并且可以针对给定配置进行固定,也可以根据可用 CPU 内核的数量自动调整(请参阅worker_processes)。

nginx及其模块的工作方式在配置文件中确定。默认情况下,配置文件被命名为nginx.conf,并放置在目录/usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx中。

  • 我通过 homebrew 安装,配置文件位于 /opt/homebrew/etc/nginx/nginx.conf

一、启动、停止、重载配置

要启动nginx,请运行可执行文件。一旦nginx启动,就可以通过使用-s参数调用可执行文件来控制它。使用以下语法:

  1. nginx -s signal

signal 可以以下之一

  • stop:快速关机
  • quit:正常关机
  • reload:重新加载配置文件
  • reopn:重新打开日志文件

例如,要停止nginx进程并等待工作进程完成对当前请求的处理,可以执行以下命令:

  1. nginx -s quit
  • 此命令应在启动 nginx 的同一用户下执行

在将重新加载配置的命令发送到nginx或重新启动之前,不会应用在配置文件中所做的更改。要重新加载配置,请执行:

  1. nginx -s reload

主进程收到重新加载配置的信号后,将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果此操作成功,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程,接收关闭命令,停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到处理。之后,旧的工作进程退出。

信号也可以在Unix工具(如kill实用程序)的帮助下发送到nginx进程。在这种情况下,信号直接发送到具有给定进程 ID 的进程。默认情况下,nginx 主进程的进程 ID 写入目录 /usr/local/nginx/logs/var/run 中的 nginx.pid。例如,如果主进程 ID 为 1628,要发送导致 nginx 正常关闭的 QUIT 信号,请执行:

  1. kill -s QUIT 1628

为了获取所有正在运行的nginx进程的列表,例如,可以通过以下方式使用ps实用程序:

  1. ps -ax | grep nginx

有关向nginx发送信号的更多信息,请参阅控制nginx

二、配置文件的结构

nginx由由配置文件中指定的指令控制的模块组成。指令分为简单指令和块指令。简单指令由名称和参数组成,用空格分隔,并以分号 (;)结尾。块指令具有与简单指令相同的结构,但它不是分号,而是以一组用大括号({})括起来的附加指令结尾。如果块指令可以在大括号内包含其他指令,则称为上下文(例如:events, http, serverlocation)。

放置在任何上下文之外的配置文件中的指令都被视为位于主上下文中。eventshttp 指令驻留在主上下文中,server驻留在http中,location驻留在server中。

#符号后面的一行的其余部分被视为注释

三、提供静态内容

Web 服务器的一项重要任务是提供文件(如图像或静态 HTML 页面)。您将实现一个示例,其中根据请求,文件将从不同的本地目录提供:/data/www(可能包含 HTML 文件)和/data/images(包含图像)。这将需要编辑配置文件,并在 http 块内设置一个具有两个location块的server块。

首先,创建 /data/www 目录,将包含任何文本内容的 index.html 文件放入其中,然后创建 /data/images 目录并在其中放置一些图像。

接下来,打开配置文件。默认配置文件已经包含server块的几个示例,大部分已注释掉。现在注释掉所有这样的块,并启动一个新的server块:

  1. http{
  2. server{}
  3. }

通常,配置文件可能包括多个server块,这些server块由它们侦听的端口和服务器名称来区分。一旦nginx决定了哪个server处理请求,它就会根据服务器块内定义的位置指令的参数测试请求标头中指定的URI。

将以下location块添加到server块:

  1. location / {
  2. root /data/www;
  3. }

location块指定”/“前缀与请求中的 URI 相比较。对于匹配的请求,URI 将添加到根指令中指定的路径,即 /data/www,以形成本地文件系统上所请求文件的路径。如果有多个匹配的location块,nginx 会选择具有最长前缀的位置块。上面的location块提供了长度为 1 的最短前缀,因此仅当所有其他位置块都未能提供匹配项时,才会使用此块。

接下来添加第二个 location块:

  1. location /images/ {
  2. root /data;
  3. }

它将匹配以 /images/ 开头的请求(location /也匹配此类请求,但前缀较短)。

server 块的结果配置应如下所示:

  1. server {
  2. location / {
  3. root /data/www;
  4. }
  5. location /images/ {
  6. root /data;
  7. }
  8. }

这已经是服务器的工作配置,该服务器侦听标准端口 80,并且可以在本地计算机上以 http://localhost 访问。为了响应 URI 以 /images/ 开头的请求,服务器将从 /data/images 目录发送文件。例如,为了响应 http://localhost/images/example.png请求,nginx将发送/data/images/example.png文件。如果这样的文件不存在,nginx将发送指示404错误的响应。URI 不以 /images/ 开头的请求将映射到 /data/www 目录中。例如,为了响应http://localhost/some/example.html请求,nginx 将发送 /data/www/some/example.html 文件。

要应用新配置,如果nginx尚未启动,请启动nginx,或者通过执行以下命令将重新加载信号发送到nginx的主进程:

  1. nginx -s reload

如果某些内容无法按预期工作,您可以尝试在访问.log和错误中找出原因.log目录 /usr/local/nginx/logs/var/log/nginx 中的文件。

四、设置简单的代理服务器