入门指南

启动、停止和重新加载配置
配置文件的结构
提供静态内容
设置简单代理服务器
设置 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 -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 names 区分的 server 块。一旦 nginx 决定哪个 server 处理请求,它就会将请求头中指定的 URI 与 server 块内定义的 location 指令的参数进行测试。

server 块中添加以下 location 块:

location / {
    root /data/www;
}

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

接下来,添加第二个location块:

location /images/ {
    root /data;
}

它将匹配以/images/开头的请求(location /也匹配这样的请求,但前缀更短)。

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

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(如果尚未启动),或者发送reload信号给nginx的主进程,执行以下操作:

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块中,放置proxy_pass指令,参数中指定了代理服务器的协议、名称和端口(在我们的情况下,是http://localhost:8080):

server {
    location / {
        proxy_pass http://localhost: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 http://localhost:8080/;
    }

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

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

要应用新配置,请按照前面部分的说明向nginx发送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参数用于传递请求参数。最终配置如下:

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