官网地址:https://nginx.org/en/docs/beginners_guide.html
本指南对 nginx 进行了基本介绍,并描述了一些可以使用它完成的简单任务。假定nginx已经安装在阅读者的机器上。如果不是,请参阅nginx安装页面。本指南描述了如何启动和停止 nginx 并重新加载它的配置,解释配置文件的结构,描述了如何设置 nginx 来提供静态内容,如何将 nginx 配置为代理服务器,以及如何将它与 FastCGI 应用程序连接。
nginx 有一个主进程和几个工作进程。主进程的主要目的是读取和评估配置,并维护工作进程。工作进程处理实际请求。nginx 使用基于事件的模型和依赖于操作系统的机制来有效地在工作进程之间分发请求。工作进程的数量在配置文件中定义,可以针对给定的配置进行固定,也可以根据可用 CPU 内核的数量自动调整。
nginx 及其模块的工作方式在配置文件中确定。默认情况下,配置文件名为 nginx.conf,并放置在 /usr/local/nginx/conf、/etc/nginx 或 /usr/local/etc/nginx 目录中。
要启动nginx,运行可执行文件。一旦启动nginx,就可以通过调用带有 -s 参数的可执行文件来控制它。使用以下语法:
nginx -s signal这里的 signal 取值可能如下:
stop — 快速关闭,执行该命令直接停止 nginx,不管 nginx 当前是否还有请求在处理。
quit — 优雅的关闭,执行该命令后,如果 nginx 还有请求在处理,则等待请求处理完成后才关闭 nginx。
reload — 重新加载配置文件,修改 nginx.conf 文件后可以使用该命令去重新加载配置。
reopen — 重新打开日志文件,假如我们需要备份日志文件,备份后的日志文件为 access.log.old,然后创建一个新的 access.log 文件。你会发现,新的数据并没有写入 access.log 文件,而是写入到了access.log.old文件。这要我们去重启 nginx,如果不想重启 nginx,可以通过 reopen 重新打开日志文件。
例如,要停止 nginx 进程,等待 worker 进程完成服务当前请求,可以执行以下命令:
nginx -s quit这个命令应该在启动nginx的同一用户下执行。
在将重新加载配置的命令发送到 nginx 或 重新启动配置之前,不会应用配置文件中所做的更改。要重新加载配置,请执行:
nginx -s reload一旦主进程接收到重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程并向旧工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置。老工作进程接收关闭命令,停止接受新连接,并继续为当前请求提供服务,直到所有这些请求都得到服务为止。然后,老工作进程退出。
在 kill 实用程序等 Unix 工具的帮助下,还可以向 nginx 进程发送信号。在本例中,一个信号被直接发送到具有给定进程ID的进程。默认情况下,nginx 主进程的进程ID被写入nginx。pid 位于 /usr/local/nginx/logs 或 /var/run 目录中。例如,如果主进程ID是1628,要发送退出信号导致 nginx 优雅地关闭,执行:
kill -s QUIT 1628要获得所有运行nginx进程的列表,可以使用ps实用程序,例如:
ps -ax | grep nginx有关向nginx发送信号的更多信息,请查阅控制Nginx。
nginx 由模块组成,模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,它们由空格分隔,并以分号(;)结束。块指令具有与简单指令相同的结构,但它的结尾不是分号,而是一组由大括号({和})包围的附加指令。如果一个块指令可以在大括号中包含其他指令,那么它被称为上下文(例如:events、http、server 和 location)。
放在任何上下文之外的配置文件中的指令被认为是在主上下文中。events 和 http 指令驻留在主上下文中,server指令驻留在http复合指令中,location指令驻留在server复合指令中。即:
worker_processes 1;
events {
worker_connections 1024;
}
# 复合指令
http {
include mime.types;
default_type application/octet-stream;
# 复合指令
server {
listen 8080;
server_name localhost;
location / {
root html;
index index.html;
}
}
}# 符号后面的内容被认为是注释。
一个重要的 web 服务器任务是提供文件(比如图像或静态HTML页面)。您将实现一个示例,根据请求,文件将从不同的本地目录中得到:/data/www(可能包含HTML文件)和 /data/images(包含图像)。这需要编辑配置文件,并在 http 块内部设置 server 块,并有两个 location 块。
首先,创建 /data/www 目录并将包含任何文本内容的 index.html 文件放入其中,然后创建 /data/images 目录并在其中放置一些图像。
接下来,打开配置文件。默认配置文件已经包含了 server 块的几个例子,大部分都被注释掉了。现在注释掉所有这样的块,并开始一个新的服务器块:
http {
server {
}
}通常,配置文件可能包含几个 server 块,这些 server 块由它们侦听的端口和服务器名称来区分。一旦 nginx 决定哪个服务器处理请求,它就根据服务器块中定义的 location 指令的参数测试请求头中指定的URI。
将以下 location 块添加到 server 块:
location / {
root /data/www;
}此 location 块指定与请求中的URI相比较的“/”前缀。为了匹配请求,URI 将被添加到根指令中指定的路径,即 /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://localhost/ 。对于以 /images/ 开头的 uri 请求,服务器将从 /data/images 目录发送文件。例如,响应https://localhost/images/example.png 请求,nginx 将发送 /data/images/example.png 文件。如果不存在这样的文件,nginx 将发送一个响应,指示 404 错误。不以 /images/ 开头的 uri 请求将映射到 /data/www 目录。例如,响应 https://localhost/some/example.html 请求,nginx 将发送 /data/www/some/example.html 文件。
若要应用新配置,请在nginx尚未启动时启动nginx,或向 nginx 的主进程发送重新加载信号,方法如下:
nginx -s reload如果某些东西不能按预期工作,您可以尝试在 /usr/local/nginx/logs 或 /var/log/nginx 目录中的 access.log 和 error.log 文件中找出原因。
nginx 的一个常见用途是将其设置为代理服务器,这意味着服务器接收请求,将请求传递给代理服务器,从代理服务器检索响应,并将响应发送给客户机。
我们将配置一个基本代理服务器,它使用本地目录中的文件来处理图像请求,并将所有其他请求发送到代理服务器。在本例中,这两个服务器将在一个 nginx 实例上定义。
首先,通过在 nginx 的配置文件中添加一个包含以下内容的 server 块来定义代理服务器:
server {
listen 8080;
root /data/up1;
location / {
}
}这将是一个简单的服务器,它监听端口8080(之前,由于使用了标准端口80,所以没有指定 listen 指令),并将所有请求映射到本地文件系统上的 /data/up1 目录。创建此目录并将 index.html 文件放入其中。注意,根指令放在服务器上下文中。当为服务请求而选择的 location 块不包含自己的根指令时,将使用这种根指令。
接下来,使用上一节中的服务器配置并修改它,使其成为代理服务器配置。在第一个 location 块中,将 proxy_pass指 令与参数中指定的协议、代理服务器的名称和端口放在一起 (在我们的例子中,是https://localhost:8080 ):
server {
location / {
proxy_pass https://localhost:8080;
}
location /images/ {
root /data;
}
}我们将修改第二个 location 块,它当前将带有 /images/ 前缀的请求映射到 /data/images 目录下的文件,使其匹配具有典型文件扩展名的图像请求。修改后的位置块如下:
location ~ .(gif|jpg|png)$ {
root /data/images;
}该参数是一个正则表达式,它匹配所有以 .gif、.jpg 或 .png结尾的 uri。正则表达式的前面应该加上~。相应的请求将映射到/data/images目录。
当 nginx 选择一个 location 块来服务一个请求时,它首先检查指定前缀的 location 指令,记住前缀最长的位置,然后检查正则表达式。如果与正则表达式匹配,nginx 将选择此位置,否则,它将选择之前记住的location。
代理服务器的最终配置如下:
server {
location / {
proxy_pass https://localhost:8080/;
}
location ~ .(gif|jpg|png)$ {
root /data/images;
}
}该服务器将过滤以 .gif、.jpg 或 .png 结尾的请求,并将它们映射到 /data/images 目录(通过向根指令的参数添加URI),并将所有其他请求传递到上面配置的代理服务器。
要应用新的配置,请将reload信号发送到nginx,如前面部分所述。
可以使用更多的指令来进一步配置代理连接。
nginx 可用于将请求路由到 FastCGI 服务器,FastCGI 服务器运行使用各种框架和编程语言(如PHP)构建的应用程序。
使用 FastCGI 服务器的最基本的 nginx 配置包括使用 fastcgi_pass 指令而不是 proxy_pass 指令,以及 fastcgi_param 指令来设置传递给 FastCGI 服务器的参数。假设 FastCGI 服务器可以在localhost:9000 上访问。以上一节中的代理配置为基础,用 fastcgi_pass 指令替换 proxy_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 上运行的代理服务器。