初学者指南

内容

本指南对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 可能是以下之一:

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

例如,要停止 nginx 进程并等待 worker 进程完成当前请求的服务,可以执行以下命令:

nginx -s quit

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

更改配置文件后,必须发送重新加载配置的命令给nginx或重新启动nginx,更改才会生效。要重新加载配置,请执行:

重新加载 nginx

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

信号也可以通过类似kill实用程序这样的Unix工具发送给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 中。

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

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

首先,创建 /data/www 目录,并在其中放置一个带有任何文本内容的 index.html 文件,然后创建 /data/images 目录并在其中放置一些图片。

接下来,打开配置文件。默认配置文件已经包含了几个server块的示例,大部分是被注释掉的。现在先注释掉所有这样的块,然后开始一个新的server块:

http { server { } }

通常,配置文件可能包含多个由端口区分的 serverdistinguished,它们通过监听的端口和 server names 区分。一旦 nginx 决定哪个 server 处理请求,它会将请求头中指定的 URI 与 server 块内定义的 location 指令的参数进行匹配。

将以下 location 块添加到 server 块中:

location / { root /data/www; }

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

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

location /images/ { root /data; }

对于以/images/开头的请求来说,这将是一个匹配项(location /也会匹配这样的请求,但前缀更短)。

server块的最终配置应如下所示:

服务器 { 位置 / { 根 /数据/ www; }

位置 /图片/ {
    根 /数据;
}

}

这已经是一个在标准端口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的主进程发送reload信号,执行以下操作:

重新加载 nginx

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

将 nginx 设置为代理服务器是其常见用途之一,代理服务器接收请求,将其传递给代理服务器,从中检索响应,并将其发送给客户端。

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

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

服务器 { 监听 8080; 根 /数据/up1;

位置 / {
}

}

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

接下来,使用上一节中的服务器配置,并修改为代理服务器配置。在第一个 location 块中,使用 proxy_pass 指令,指定参数中代理服务器的协议、名称和端口(在我们的案例中,是 http://localhost:8080):

服务器 { 位置 / { 代理_传递 http://localhost:8080; }

位置 /images/ { 
    根 /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,否则选择之前记住的那个。

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

服务器 { 地址 / { 代理_传送 http://localhost:8080/; }

地址 ~ \.(gif|jpg|png)$ { 
    根 /data/images; 
} 

}

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

要应用新配置,请按照前面章节中描述的方法向nginx发送reload信号。

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

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参数用于传递请求参数。最终的配置将是:

服务器 { 位置 / { fastcgi_pass localhost:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; }

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

}

这将建立一个服务器,该服务器将通过FastCGI协议将除静态图像请求外的所有请求路由到在localhost:9000上运行的代理服务器。

总结
本指南介绍了nginx的基本概念,并描述了一些可以使用nginx完成的简单任务。nginx已经安装在读者的机器上。如果没有安装,请参阅安装nginx页面。指南描述了如何启动和停止nginx,重新加载配置文件,解释了配置文件的结构,并描述了如何设置nginx来提供静态内容,如何将nginx配置为代理服务器,以及如何将其连接到FastCGI应用程序。nginx有一个主进程和多个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程实际处理请求。nginx采用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分配请求。工作进程的数量在配置文件中定义,可以针对特定配置固定或自动调整为可用CPU核心的数量。nginx和其模块的工作方式由配置文件确定。默认情况下,配置文件名为nginx.conf,放置在目录/usr/local/nginx/conf、/etc/nginx或/usr/local/etc/nginx中。