入门指南

启动、停止和重新加载配置
配置文件结构
提供静态内容服务
设置简单的代理服务器
设置 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

其中 signal 可以是以下之一

例如,要停止 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 由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。简单指令由名称和参数组成,用空格分隔,并以分号 (;) 结尾。块指令具有与简单指令相同的结构,但它不以分号结尾,而是以一组由大括号 ({}) 包围的附加指令结尾。如果一个块指令在大括号内可以包含其他指令,则称为上下文(示例:eventshttpserverlocation)。

放置在配置文件中任何上下文之外的指令被视为处于 main 上下文中。eventshttp 指令驻留在 main 上下文中,serverhttp 中,而 locationserver 中。

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

提供静态内容服务

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 块提供了长度为 1 的最短前缀,因此只有在所有其他 location 块都无法匹配时,才会使用此块。

接下来,添加第二个 location

location /images/ {
    root /data;
}

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

所得的 server 块配置应如下所示

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

    location /images/ {
        root /data;
    }
}

这是一个已经在标准端口 80 上运行并可在本地机器上通过 https:/// 访问的服务器配置。响应以 /images/ 开头的 URI 请求时,服务器将从 /data/images 目录发送文件。例如,在响应 https:///images/example.png 请求时,nginx 将发送 /data/images/example.png 文件。如果该文件不存在,nginx 将发送表示 404 错误的响应。URI 不以 /images/ 开头的请求将被映射到 /data/www 目录。例如,在响应 https:///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(之前未指定 listen 指令,因为使用了标准端口 80),并将所有请求映射到本地文件系统上的 /data/up1 目录。创建此目录并将 index.html 文件放入其中。请注意,root 指令放置在 server 上下文中。当为处理请求而选择的 location 块不包含自己的 root 指令时,将使用此类 root 指令。

接下来,使用上一节中的服务器配置并对其进行修改,使其成为代理服务器配置。在第一个 location 块中,放置带有协议、名称和代理服务器端口(在我们的例子中为 https://:8080)的 proxy_pass 指令

server {
    location / {
        proxy_pass https://: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://: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 上运行的代理服务器。