Appearance
控制 Nginx
提示
来自deepseek解释
原文链接:https://nginx.org/en/docs/control.html
nginx 可以通过信号(signal)进行控制。默认情况下,主进程(master process)的进程 ID 会写入 /usr/local/nginx/logs/nginx.pid 文件。该文件名可以在配置时更改,或在 nginx.conf 中使用 pid 指令指定。
主进程支持以下信号:
| 信号 | 作用 |
|---|---|
TERM, INT | 快速关闭 |
QUIT | 优雅关闭 |
HUP | 更改配置,保持与时区同步(仅适用于 FreeBSD 和 Linux),使用新配置启动新的工作进程,优雅关闭旧的工作进程 |
USR1 | 重新打开日志文件 |
USR2 | 升级可执行文件 |
WINCH | 优雅关闭工作进程 |
单个工作进程(worker process)也可以使用信号进行控制,但通常不是必需的。工作进程支持的信号有:
| 信号 | 作用 |
|---|---|
TERM, INT | 快速关闭 |
QUIT | 优雅关闭 |
USR1 | 重新打开日志文件 |
WINCH | 异常终止,用于调试(需要启用 debug_points) |
更改配置
为了使 nginx 重新读取配置文件,应向主进程发送 HUP 信号。主进程首先检查配置文件的语法有效性,然后尝试应用新配置,即打开日志文件和新的监听套接字。如果此操作失败,它会回滚更改并继续使用旧配置工作。如果成功,它会启动新的工作进程,并向旧工作进程发送消息,请求它们优雅地关闭。
旧工作进程关闭监听套接字,继续为旧客户端提供服务。在所有客户端服务完成后,旧工作进程被关闭。
通过示例来说明:假设 nginx 运行在 FreeBSD 上,命令 ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)' 产生以下输出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
33127 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33128 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)
33129 33126 nobody 0.0 1364 kqread nginx: worker process (nginx)如果向主进程发送 HUP 信号,输出变为:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33129 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)其中一个旧工作进程(PID 33129)仍在继续工作。一段时间后它退出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)日志轮替
为了轮替日志文件,首先需要重命名它们。之后应向主进程发送 USR1 信号。主进程将重新打开所有当前打开的日志文件,并将工作进程运行所用的非特权用户设置为文件所有者。
成功重新打开后,主进程关闭所有打开的文件,并向工作进程发送消息,要求它们重新打开文件。工作进程也会立即打开新文件并关闭旧文件。因此,旧文件几乎可以立即用于后续处理,如压缩。
在线升级可执行文件
为了升级服务器可执行文件,首先应将新的可执行文件放置到旧文件的位置。之后应向主进程发送 USR2 信号。
主进程首先将其进程 ID 文件重命名为带有 .oldbin 后缀的新文件,例如 /usr/local/nginx/logs/nginx.pid.oldbin,然后启动新的可执行文件,新文件进而启动新的工作进程:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)之后,所有工作进程(旧的与新的)继续接受请求。
如果向第一个主进程发送 WINCH 信号,它将向其工作进程发送消息,请求它们优雅地关闭,工作进程将开始退出:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)一段时间后,只有新的工作进程会处理请求:
PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)需要注意的是,旧的主进程不会关闭其监听套接字,如果需要,可以管理它重新启动其工作进程。
如果新可执行文件因某种原因工作不正常,可以采取以下措施之一:
- 向旧的主进程发送
HUP信号。旧的主进程将在不重新读取配置的情况下启动新的工作进程。之后,可以通过向新的主进程发送QUIT信号来优雅地关闭所有新进程。 - 向新的主进程发送
TERM信号。它将向其工作进程发送消息,请求它们立即退出,所有工作进程将几乎立即退出。(如果新进程因某种原因未退出,应向其发送KILL信号强制退出。)当新的主进程退出时,旧的主进程将自动启动新的工作进程。
如果新的主进程退出,旧的主进程会丢弃进程 ID 文件中的 .oldbin 后缀。
如果升级成功,则向旧的主进程发送 QUIT 信号,只有新进程会保留:
PID PPID USER %CPU VSZ WCHAN COMMAND
36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)