Skip to content

nginx 初学者指南

Nginx 指南介绍

本章节为翻译内容,原文:https://nginx.org/en/docs/beginners_guide.html

本指南简要介绍了 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 参数的可执行文件来控制它。使用以下语法:

bash
nginx -s signal

其中 signal 可能是以下之一:

  • stop — 快速关闭
  • quit — 优雅关闭
  • reload — 重新加载配置文件
  • reopen — 重新打开日志文件

例如,要在等待工作进程完成当前请求后停止 nginx 进程,可以执行以下命令:

bash
nginx -s quit

INFO

此命令应在启动 nginx 的同一用户下执行。

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

bash
nginx -s reload

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

也可以使用 Unix 工具(如 kill 工具)向 nginx 进程发送信号。在这种情况下,信号直接发送到具有给定进程 ID 的进程。nginx 主进程的进程 ID 默认写入位于目录 /usr/local/nginx/logs/var/runnginx.pid 中。例如,如果主进程 ID 为 1628,为了实现 nginx 的优雅关闭,执行:

bash
kill -s QUIT 1628

要获取所有正在运行的 nginx 进程的列表,可以使用 ps 工具,例如,以下方式:

bash
ps -ax | grep nginx

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

配置文件结构

nginx 由多个模块组成,这些模块通过在配置文件中指定的指令来控制。指令分为简单指令和块指令。简单指令由名称和参数组成,参数之间用空格分隔,以分号(;)结尾。块指令的结构与简单指令相同,但不以分号结束,而是以一组被大括号({ 和 })包围的附加指令结束。如果一个块指令内可以包含其他指令,则称为上下文(例如:eventshttpserverlocation)。

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

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

提供静态内容服务

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

首先,创建 /data/www 目录并放入一个包含任意文本内容的 index.html 文件,然后创建 /data/images 目录并放置一些图片。

接下来,打开配置文件。默认配置文件已经包含了几个服务器块的示例,大多数是被注释的。现在,注释掉所有这些块并开始一个新的服务器块:

nginx
http {
    server {
    }
}

通常,配置文件可能包含多个服务器块,通过它们监听的端口和服务器名称来区分。一旦 nginx 决定哪个服务器处理请求,它就会测试请求头中指定的 URI 与服务器块内定义的位置指令的参数。

向服务器块添加以下位置块:

nginx
location / {
    root /data/www;
}

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

接下来,添加第二个位置块:

nginx
location /images/ {
    root /data;
}

它将匹配以 /images/ 开始的请求(位置 / 也匹配这样的请求,但前缀较短)。

服务器块的最终配置应如下所示:

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

    location /images/ {
        root /data;
    }
}

这已经是一个工作中的服务器配置,监听标准端口 80,并可在本机上通过 http://localhost/ 访问。对于以 /images/ 开头的 URI 的请求,服务器将从 /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 的主进程发送重新加载信号:

bash
nginx -s reload

如果有些事情不如预期工作,您可以尝试在 /usr/local/nginx/logs/var/log/nginx 目录中的 access.log 和 error.log 文件中找出原因。

设置一个简单的代理服务器

nginx 常见的用途之一是将其设置为代理服务器,这意味着一个服务器接收请求,将它们传递给被代理的服务器,从它们那里检索响应,并将响应发送给客户端。

我们将配置一个基本的代理服务器,它为本地目录中的图片文件提供请求服务,并将所有其他请求发送到一个代理服务器。在这个示例中,这两个服务器将在单个 nginx 实例上定义。

首先,通过向 nginx 的配置文件添加一个额外的服务器块来定义被代理的服务器,内容如下:

nginx
server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将是一个简单的服务器,监听端口 8080(之前没有指定监听指令,因为使用了标准端口 80)并将所有请求映射到本地文件系统的 /data/up1 目录。创建这个目录,并将 index.html 文件放入其中。注意,root 指令放在服务器上下文中。当为请求服务的位置块不包含自己的 root 指令时,使用这样的 root 指令。

接下来,使用前一节中的服务器配置,并修改它以使其成为代理服务器配置。在第一个位置块中,放入 proxy_pass 指令,并在参数中指定被代理服务器的协议、名称和端口(在我们的例子中,是 http://localhost:8080):

nginx
server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

我们将修改第二个位置块,该块当前将带 /images/ 前缀的请求映射到 /data/images 目录下的文件,使其匹配带有典型文件扩展名的图片请求。修改后的位置块如下所示:

nginx
location ~ \.(gif|jpg|png)$ {
    root /data/images;
}

参数是一个正则表达式,匹配所有以 .gif.jpg.png 结尾的 URI。正则表达式应以 ~ 开头。相应的请求将被映射到 /data/images 目录。

当 nginx 选择一个位置块来服务一个请求时,它首先检查指定前缀的位置指令,记住具有最长前缀的位置,然后检查正则表达式。如果与正则表达式匹配,nginx 选择此位置;否则,它选择之前记住的位置。

代理服务器的最终配置将如下所示:

nginx
server {
    location / {
        proxy_pass http://localhost:8080/;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

此服务器将过滤以 .gif.jpg.png 结尾的请求,并将它们映射到 /data/images 目录(通过添加 URIroot 指令的参数),并将所有其他请求传递给上面配置的被代理服务器。

要应用新配置,请按照前面章节中描述的方式向 nginx 发送重载信号(nginx -s 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 参数用于传递请求参数。结果配置将是:

nginx
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 上操作的代理服务器。这样的配置能够允许 nginx 作为前端服务器来处理动态内容的请求,同时为静态图像提供直接访问,优化了资源的加载和处理效率。