新手入门指南

启动、停止和重新加载配置
配置文件的结构
提供静态内容服务
设置简单的代理服务器
设置 FastCGI 代理

本指南对 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

其中信号可以是以下之一

例如,要停止 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,要发送 QUIT 信号导致 Nginx 优雅关闭,请执行

kill -s QUIT 1628

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

ps -ax | grep nginx

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

配置文件的结构

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

放置在配置文件中任何上下文之外的指令被认为位于main上下文中。eventshttp指令位于main上下文中,server位于http上下文中,location位于server上下文中。

#符号之后的行的其余部分被视为注释。

提供静态内容服务

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

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

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

http {
    server {
    }
}

通常,配置文件可能包含多个server块,这些块通过它们监听的端口和服务器名称区分。一旦 Nginx 确定哪个server处理请求,它就会将请求标头中指定的 URI 与server块内定义的location指令的参数进行匹配。

将以下location块添加到server块中

location / {
    root /data/www;
}

location块指定与请求中的 URI 比较的“/”前缀。对于匹配的请求,URI 将添加到root指令中指定的路径(即/data/www),以形成本地文件系统上请求文件的路径。如果有多个匹配的location块,Nginx 将选择前缀最长的那个。上面的location块提供了最短的前缀,长度为 1,因此只有在所有其他location块都无法提供匹配时,才会使用此块。

接下来,添加第二个location

location /images/ {
    root /data;
}

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

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

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

这已经是服务器的一个工作配置,它监听标准端口 80,并且可以在本地机器上的https://127.0.0.1/访问。对于 URI 以/images/开头的请求,服务器将发送/data/images目录中的文件。例如,对于https://127.0.0.1/images/example.png请求,Nginx 将发送/data/images/example.png文件。如果此文件不存在,Nginx 将发送指示 404 错误的响应。URI 不以/images/开头的请求将映射到/data/www目录。例如,对于https://127.0.0.1/some/example.html请求,Nginx 将发送/data/www/some/example.html文件。

要应用新配置,如果尚未启动 Nginx,请启动它,或者通过执行以下命令向 Nginx 的主进程发送reload信号

nginx -s reload

如果某些内容无法按预期工作,您可以尝试在/usr/local/nginx/logs/var/log/nginx目录中的access.logerror.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 可以用于将请求路由到运行使用各种框架和编程语言(例如 PHP)构建的应用程序的 FastCGI 服务器。

与 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 上运行的代理服务器。