Beginner's Guide

本指南对 nginx 进行了基本介绍,并描述了一些可以使用它完成的简单任务。假定已经在阅读器的计算机上安装了 nginx。如果不是,请参见Installing nginx页。本指南描述了如何启动和停止 nginx 以及重新加载其配置,解释了配置文件的结构,并描述了如何设置 nginx 以提供静态内容,如何将 nginx 配置为代理服务器以及如何将其与 FastCGI 应用程序。

nginx 有一个主进程和几个工作进程。主流程的主要目的是读取和评估配置,以及维护工作流程。工作进程对请求进行实际处理。 nginx 使用基于事件的模型和依赖于 os 的机制来有效地在工作进程之间分配请求。工作进程的数量在配置文件中定义,可以针对给定的配置固定,也可以自动调整为可用 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 —重新打开日志文件

例如,要在 await 工作进程完成对当前请求的服务的过程中停止 nginx 进程,可以执行以下命令:

nginx -s quit

Note

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

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

nginx -s reload

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

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

kill -s QUIT 1628

为了获取所有正在运行的 nginx 进程的列表,可以按以下方式使用psUtil:

ps -ax | grep nginx

有关将 signal 发送到 nginx 的更多信息,请参见Controlling nginx

配置文件的结构

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

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

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

提供静态内容

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

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

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

http {
    server {
    }
}

通常,配置文件可按其listenserver names的端口包括几个serverdistinguished。一旦 nginx 决定了哪个server处理请求,它就会针对server块中定义的location伪指令的参数测试在请求 Headers 中指定的 URI。

将以下location块添加到server块:

location / {
    root /data/www;
}

与来自请求的 URI 相比,此location块指定“ /”前缀。对于匹配的请求,会将 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 上侦听,并且可以在本地计算机http://localhost/上访问。响应以/images/开头的 URI 请求,服务器将从/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(如果尚未启动),或者通过执行以下命令将reloadsignal 发送到 nginx 的主进程:

nginx -s reload

Note

如果某些操作无法按预期工作,则可以尝试在目录/usr/local/nginx/logs/var/log/nginxaccess.logerror.log文件中查找原因。

设置简单的代理服务器

nginx 的一种常用用法是将其设置为代理服务器,这意味着服务器可以接收请求,将请求传递给代理服务器,从请求中获取响应并将其发送给客户端。

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

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

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

这将是一个简单的服务器,它侦听端口 8080(以前,由于使用了标准端口 80,因此未指定listen指令),并将所有请求映射到本地文件系统上的/data/up1目录。创建此目录并将index.html文件放入其中。请注意,root指令位于server上下文中。当选择用于服务请求的location块不包含自己的root指令时,将使用此类root指令。

接下来,使用上一部分中的服务器配置并对其进行修改以使其成为代理服务器配置。在第一个location块中,将proxy_pass指令与参数中指定的代理服务器的协议,名称和端口(在本例中为http://localhost:8080)放在一起:

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

    location /images/ {
        root /data;
    }
}

我们将修改第二个location块,该块当前将带有/images/前缀的请求映射到/data/images目录下的文件,以使其与具有典型文件 extensions 的图像的请求匹配。修改后的location块如下所示:

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

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

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

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

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

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

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

要应用新配置,请按照前几节中的说明将reloadsignal 发送到 nginx。

许多more指令可用于进一步配置代理连接。

设置 FastCGI 代理

nginx 可用于将请求路由到 FastCGI 服务器,该服务器运行使用各种框架和编程语言(例如 PHP)构建的应用程序。

与 FastCGI 服务器一起使用的最基本的 Nginx 配置包括使用fastcgi_pass指令而不是proxy_pass指令和fastcgi_param指令来设置传递给 FastCGI 服务器的参数。假设在localhost:9000上可访问 FastCGI 服务器。以上一节中的代理配置为基础,将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上运行的代理服务器。