Appearance
初学者指南
提示
来自deepseek解释
原文链接:https://nginx.org/en/docs/beginners_guide.html
本指南对 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 参数调用可执行文件来控制它。使用以下语法:
bash
nginx -s signal其中 signal 可以是以下之一:
stop— 快速关闭quit— 优雅关闭reload— 重载配置文件reopen— 重新打开日志文件
例如,要停止 nginx 进程,并等待工作进程完成处理当前请求,可以执行以下命令:
bash
nginx -s quit此命令应由启动 nginx 的同一用户执行。
对配置文件所做的修改只有在向 nginx 发送重载配置的命令或重新启动它后才会生效。要重载配置,请执行:
bash
nginx -s reload一旦主进程接收到重载配置的信号,它会检查新配置文件的语法有效性,并尝试应用其中提供的配置。如果成功,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。否则,主进程将回滚更改并继续使用旧配置工作。
收到关闭命令的旧工作进程会停止接受新连接,并继续为当前请求提供服务,直到所有这些请求都被处理完毕。之后,旧工作进程退出。
也可以借助 Unix 工具(例如 kill 实用程序)向 nginx 进程发送信号。在这种情况下,信号会直接发送给具有给定进程 ID 的进程。nginx 主进程的进程 ID 默认写入 nginx.pid 文件中,该文件位于 /usr/local/nginx/logs 或 /var/run 目录下。例如,如果主进程 ID 为 1628,要发送 QUIT 信号使 nginx 优雅关闭,请执行:
bash
kill -s QUIT 1628要获取所有正在运行的 nginx 进程的列表,可以使用 ps 实用程序,例如通过以下方式:
bash
ps -ax | grep nginx有关向 nginx 发送信号的更多信息,请参阅 控制 nginx。
配置文件的结构
nginx 由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单指令由名称和参数组成,这些名称和参数以空格分隔,并以分号(;)结尾。块指令与简单指令具有相同的结构,但不是以分号结尾,而是以一组用花括号({ 和 })括起来的附加指令结尾。
如果一个块指令可以在花括号内包含其他指令,则它被称为上下文(例如:events、http、server 和 location)。放在任何上下文之外的配置文件中的指令被认为是主上下文。events 和 http 指令位于主上下文中,server 位于 http 中,而 location 位于 server 中。
# 号之后的行其余部分被视为注释。
提供静态内容服务
Web 服务器的一项重要任务是提供文件服务(例如图像或静态 HTML 页面)。我们将实现一个示例,根据请求,文件将从不同的本地目录提供服务:/data/www(可能包含 HTML 文件)和 /data/images(包含图像)。这需要编辑配置文件,并在 http 块内设置一个包含两个 location 块的 server 块。
首先,创建 /data/www 目录,并将包含任意文本内容的 index.html 文件放入其中,然后创建 /data/images 目录并在其中放置一些图像。
接下来,打开配置文件。默认配置文件已经包含几个 server 块的示例,大部分是注释掉的。现在,注释掉所有此类块,并启动一个新的 server 块:
nginx
http {
server {
}
}通常,配置文件可以包含多个 server 块,这些块通过它们监听的端口和服务器名称进行区分。一旦 nginx 决定哪个 server 处理请求,它会根据请求头中指定的 URI 以及 server 块中定义的 location 指令的参数进行测试。
向 server 块添加以下 location 块:
nginx
location / {
root /data/www;
}此 location 块指定了与请求中的 URI 进行比较的 / 前缀。对于匹配的请求,URI 将被添加到 root 指令中指定的路径(即 /data/www)后面,以形成本地文件系统上所请求文件的路径。如果有多个匹配的 location 块,nginx 会选择前缀最长的那个。上面的 location 块提供了长度为 1 的最短前缀,因此只有当所有其他 location 块都无法匹配时,才会使用此块。
接下来,添加第二个 location 块:
nginx
location /images/ {
root /data;
}它将匹配以 /images/ 开头的请求(location / 也匹配此类请求,但此前缀较短)。最终 server 块的配置应如下所示:
nginx
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 尚未启动,请启动它,或者向 nginx 的主进程发送 reload 信号,方法是执行:
bash
nginx -s reload如果某些内容无法按预期工作,您可以尝试在 /usr/local/nginx/logs 或 /var/log/nginx 目录中的 access.log 和 error.log 文件中查找原因。
设置一个简单的代理服务器
nginx 的常见用途之一是将其设置为代理服务器,这意味着一个接收请求、将它们传递给代理服务器、从它们那里检索响应并将它们发送给客户端的服务器。我们将配置一个基本的代理服务器,它为图像请求提供本地目录中的文件,并将所有其他请求发送到代理服务器。在此示例中,两个服务器都将在单个 nginx 实例上定义。
首先,通过向 nginx 的配置文件中添加另一个 server 块来定义代理服务器,内容如下:
nginx
server {
listen 8080;
root /data/up1;
location / {
}
}这将是一个简单的服务器,它监听端口 8080(之前,由于使用了标准端口 80,因此未指定 listen 指令),并将所有请求映射到本地文件系统上的 /data/up1 目录。创建此目录并将 index.html 文件放入其中。
接下来,使用上一节中的服务器配置,并对其进行修改以使其成为代理服务器配置。在第一个 location 块中,放置 proxy_pass 指令,并在参数中指定代理服务器的协议、名称和端口(在我们的例子中是 http://localhost:8080):
nginx
server {
location / {
proxy_pass http://localhost:8080;
}
location /images/ {
root /data;
}
}我们将修改第二个 location 块,该块当前将带有 /images/ 前缀的请求映射到 /data/images 目录下的文件,以使其匹配带有典型文件扩展名的图像请求。修改后的 location 块如下所示:
nginx
location ~ \.(gif|jpg|png)$ {
root /data/images;
}该参数是一个正则表达式,匹配所有以 .gif、.jpg 或 .png 结尾的 URI。正则表达式前面应带有 ~。相应的请求将被映射到 /data/images 目录。
当 nginx 选择一个 location 块来服务请求时,它会首先检查指定前缀的 location 指令,并记住具有最长前缀的 location,然后检查正则表达式。如果与正则表达式匹配,nginx 会选择此 location,否则,它会选择之前记住的那个。
代理服务器的最终配置将如下所示:
nginx
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 参数用于传递请求参数。生成的配置将是:
nginx
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 上运行的代理服务器。