控制 nginx
修改配置 轮换日志文件 热升级可执行文件 |
nginx 可以通过信号进行控制。主进程的进程 ID 默认写入文件 /usr/local/nginx/logs/nginx.pid
。此名称可以在配置时或在 nginx.conf
中使用 pid 指令进行修改。主进程支持以下信号:
TERM, INT 快速关机 QUIT 平滑关机 HUP 修改配置,适应更改的时区(仅适用于 FreeBSD 和 Linux),启动带新配置的新工作进程,平滑关闭旧工作进程 USR1 重新打开日志文件 USR2 升级可执行文件 WINCH 平滑关闭工作进程
单个工作进程也可以通过信号控制,尽管这不是必需的。支持的信号有:
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)