初学者指南
启动、停止和重新加载配置 配置文件的结构 提供静态内容 设置简单的代理服务器 设置 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
其中信号可能是以下之一:
stop
— 快速关机quit
— 优雅关机reload
— 重新加载配置文件reopen
— 重新打开日志文件
例如,要停止 nginx 进程并等待工作进程完成当前请求的服务,可以执行以下命令:
nginx -s quit
此命令应在启动 nginx 的同一用户下执行。
在重新加载配置的命令发送到 nginx 或重新启动之前,不会应用在配置文件中所做的更改。要重新加载配置,请执行:
nginx -s reload
一旦主进程收到重新加载配置的信号,它会检查新配置文件的语法有效性并尝试应用其中提供的配置。如果成功,主进程启动新的工作进程并向旧的工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置。旧的工作进程,接收到关闭命令,停止接受新连接并继续为当前请求提供服务,直到所有此类请求都得到服务。之后,旧的工作进程退出。
也可以借助 Unix 工具(例如kill
实用程序)向 nginx 进程发送信号。在这种情况下,信号会直接发送到具有给定进程 ID 的进程。nginx 主进程的进程 ID 默认写入 nginx.pid
目录 /usr/local/nginx/logs
或 /var/run
. 例如,如果主进程 ID 为 1628,要发送 QUIT 信号导致 nginx 正常关闭,请执行:
kill -s QUIT 1628
要获取所有正在运行的 nginx 进程的列表,ps
可以使用该实用程序,例如,通过以下方式:
ps -ax | grep nginx
有关向 nginx 发送信号的更多信息,请参阅 控制 nginx。
配置文件的结构
nginx 由由配置文件中指定的指令控制的模块组成。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,以空格分隔并以分号 ( ;
)结尾。块指令与简单指令具有相同的结构,但它以一组由大括号 ({
和}
)包围的附加指令结尾,而不是分号。如果块指令可以在大括号内包含其他指令,则称为上下文(例如: events、 http、 server和 location)。
放置在任何上下文之外的配置文件中的指令被认为是在 主上下文中。在events
和http
指令驻留在main
上下文server
中http
,并location
在 server
。
#
符号 后的其余行被视为注释。
提供静态内容
一项重要的 Web 服务器任务是提供文件(例如图像或静态 HTML 页面)。您将实现一个示例,其中根据请求,文件将从不同的本地目录提供:(/data/www
可能包含 HTML 文件)和/data/images
(包含图像)。这将需要编辑配置文件并 在http 块内设置一个带有两个位置 块的 服务器块。
首先,创建/data/www
目录并将index.html
包含任何文本内容的 文件放入其中,然后创建/data/images
目录并在其中放置一些图像。
接下来,打开配置文件。默认配置文件已经包含了server
块的几个示例,大部分都被注释掉了。现在注释掉所有这些块并开始一个新 server
块:
http { server { } }
通常,配置文件可能包含几个server
块,这些 块 由它们侦听的端口和 服务器名称区分。一旦 nginx 决定哪个处理请求,它就会根据块内定义的指令 的参数测试请求标头中指定的 URI 。 server
location
server
将以下location
块添加到 server
块中:
location / { root /data/www; }
此location
块指定/
与来自请求的 URI 相比的“ ”前缀。对于匹配的请求,URI 将被添加到root 指令中指定的路径中 ,即 to /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/
。响应以 开头的 URI 请求/images/
,服务器将从/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 尚未启动时启动它,或者reload
通过执行以下命令将信号发送到 nginx 的主进程:
nginx -s reload
在一些情况下不按预期工作,您可以尝试找出原因access.log
和error.log
目录中的文件/usr/local/nginx/logs
或/var/log/nginx
。
设置简单的代理服务器
nginx 的常见用途之一是将其设置为代理服务器,这意味着服务器接收请求,将它们传递给代理服务器,从它们检索响应,并将它们发送到客户端。
我们将配置一个基本的代理服务器,它为来自本地目录的文件的图像请求提供服务,并将所有其他请求发送到代理服务器。在此示例中,两个服务器都将在单个 nginx 实例上定义。
首先,通过server
在 nginx 的配置文件中再添加一个块来定义代理服务器,其内容如下:
server { listen 8080; root /data/up1; location / { } }
这将是一个简单的服务器,它侦听端口 8080(以前,listen
由于使用了标准端口 80 ,因此未指定该指令)并将所有请求映射到/data/up1
本地文件系统上的目录。创建此目录并将index.html
文件放入其中。请注意,该root
指令位于 server
上下文中。Such root
directive is used when the location
block selected for serving a request does not include own root
directive.
接下来,使用上一节中的服务器配置并对其进行修改,使其成为代理服务器配置。在第一个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
、 或结尾的 URI .png
。正则表达式应该以~
. 相应的请求将被映射到/data/images
目录。
当 nginx 选择一个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
指令的参数)并将所有其他请求传递到上面配置的代理服务器。
要应用新配置,请reload
按照前几节所述将信号发送到 nginx。
还有更多 指令可用于进一步配置代理连接。
设置 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; } }
这将设置一个服务器,它将除静态图像请求之外的所有请求路由到localhost:9000
通过 FastCGI 协议运行的代理服务器 。
官网地址:http://nginx.org/en/docs/beginners_guide.html
Vue server 配置
server {
listen 80;
server_name adminsite.my;
location / {
root /opt/adminsite;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://adminsite.my:80;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300;
proxy_send_timeout 300;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}