Nginx运行管理-元一软件

发布时间:2026/7/16 5:33:26
Nginx运行管理-元一软件 本文将介绍怎样通过发送信号去控制 nginx在 linux 中我们可以通过 kill 命令发送信号给 nginx这个使用 nginx -s 类似。在开始介绍控制Nginx之前我们先使用“ps -ef | grep nginx”查看一下 nginx 的进程。如下[rootS0 ~]# ps -ef | grep nginxroot213251002:21 ? 00:00:00 nginx: master process ./nginx nobody2359821325002:42 ? 00:00:00 nginx: worker process root2371423698022:26 pts/0 00:00:00grepnginx从上得知我们有一个主nginx进程master process主进程不负责处理用户请求还有一个工作进程worker process该进程数量与我们在 nginx.conf 中配置的 worker_processes 有关该进程才真实处理用户请求。Nginx可以用信号控制。默认情况下主进程的进程ID被写入文件 /usr/local/nginx/log/nginx.pid。此名称可以在配置时更改也可以在 nginx.conf 中使用 PID 指令更改。主进程支持以下信号TERM, INT快速关闭即使当前有请求正在处理也立刻关闭nginx。QUIT优雅的关闭等待当前正在处理的请求完成后才关闭nginx。HUP更改配置保持更改的时区(仅适用于FreeBSD和Linux)使用新配置启动新工作进程优雅地关闭旧工作进程。USR1重新打开日志文件。USR2更新可执行文件即 nginx 文件。WINCH优雅地关闭工作进程。单独的工作进程也可以用信号来控制尽管这不是必需的。所支持的信号为TERM, INT快速关闭即使当前有请求正在处理也立刻关闭当前进程。QUIT优雅的关闭等待当前正在处理的请求完成后才关闭当前进程。USR1重新打开日志文件。WINCH调试异常终止(需要启用debug_points)。改变配置为了让 nginx 重新读取配置文件应该向主进程发送 HUP 信号。主进程首先检查语法有效性然后尝试应用新的配置即打开日志文件和新的监听套接字。如果失败它将回滚更改并继续使用旧的配置。如果成功它将启动新的 worker 进程并向旧的worker进程发送消息请求它们优雅地关闭。旧工作进程关闭监听套接字并继续为老客户端提供服务。在所有客户端都得到服务之后旧工作进程才会被关闭。让我们用例子来说明这一点。假设 nginx 在 FreeBSD 上运行命令psaxw-opid,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 发送到主进程输出为PIDPPIDUSER%CPU VSZ WCHAN COMMAND331261root0.01164pause nginx: master process /usr/local/nginx/sbin/nginx3312933126nobody0.01380kqread nginx: worker process is shutting down(nginx)3313433126nobody0.01368kqread nginx: worker process(nginx)3313533126nobody0.01368kqread nginx: worker process(nginx)3313633126nobody0.01368kqread 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 信号到主进程master进程。然后主进程将重新打开所有当前打开的日志文件并将它们分配给一个非特权用户 (worker进程在该用户下作为所有者运行)。成功重新打开后主进程关闭所有打开的文件并向 worker 进程发送消息要求它们重新打开文件。工作进程打开新文件并立即关闭旧文件。因此旧文件几乎可以立即用于后期处理比如压缩。动态升级可执行文件为了升级服务器的可执行文件即 nginx 二进制文件应该先用新的可执行文件替换旧的文件建议将旧的nginx可执行文件进行备份如nginx.old。之后应该发送 USR2 信号到主进程USR2更新可执行文件。主进程首先用进程 ID 将其文件重命名为一个后缀为 .oldbin 的新文件例如 /usr/local/nginx/logs/nginx.pid.oldbin。然后启动新的可执行文件新的PID位于 ningx.pid 文件中启动新的工作进程PIDPPIDUSER%CPU VSZ WCHAN COMMAND331261root0.01164pause nginx: master process /usr/local/nginx/sbin/nginx3313433126nobody0.01368kqread nginx: worker process(nginx)3313533126nobody0.01380kqread nginx: worker process(nginx)3313633126nobody0.01368kqread nginx: worker process(nginx)3626433126root0.01148pause nginx: master process /usr/local/nginx/sbin/nginx3626536264nobody0.01364kqread nginx: worker process(nginx)3626636264nobody0.01364kqread nginx: worker process(nginx)3626736264nobody0.01364kqread nginx: worker process(nginx)之后所有工作进程旧进程和新进程继续接受请求。如果 WINCH 信号被发送到第一个主进程旧的主进程它将向它的工作进程发送消息请求它们优雅地关闭它们将开始退出PIDPPIDUSER%CPU VSZ WCHAN COMMAND331261root0.01164pause nginx: master process /usr/local/nginx/sbin/nginx3313533126nobody0.01380kqread nginx: worker process is shutting down(nginx)3626433126root0.01148pause nginx: master process /usr/local/nginx/sbin/nginx3626536264nobody0.01364kqread nginx: worker process(nginx)3626636264nobody0.01364kqread nginx: worker process(nginx)3626736264nobody0.01364kqread nginx: worker process(nginx)一段时间后只有新工作进程在处理请求PIDPPIDUSER%CPU VSZ WCHAN COMMAND331261root0.01164pause nginx: master process /usr/local/nginx/sbin/nginx3626433126root0.01148pause nginx: master process /usr/local/nginx/sbin/nginx3626536264nobody0.01364kqread nginx: worker process(nginx)3626636264nobody0.01364kqread nginx: worker process(nginx)3626736264nobody0.01364kqread nginx: worker process(nginx)应该注意的是旧的主进程并没有被关闭它依然能够监听套接字。如果需要可以管理它重新启动工作进程。如果由于某种原因新的可执行文件不能接受请求可以采取以下措施之一向旧主进程发送HUP信号。旧主进程将启动新的工作进程而无需重新读取配置。然后通过向新主进程发送 QUIT 信号可以优雅地关闭所有新进程。向新主进程发送 TERM 信号。然后它将向其工作进程发送一条消息请求它们立即退出它们几乎都将立即退出。(如果新进程由于某种原因没有退出则应该向它们发送 KILL 信号迫使它们退出) 当新的主进程退出时旧的主进程将自动启动新的工作进程。如果新的主进程退出那么旧的主进程将从带有进程 ID 的文件名中丢弃 .oldbin 后缀。如果升级成功则 QUIT 信号应发送到旧主进程只保留新进程PIDPPIDUSER%CPU VSZ WCHAN COMMAND362641root0.01148pause nginx: master process /usr/local/nginx/sbin/nginx3626536264nobody0.01364kqread nginx: worker process(nginx)3626636264nobody0.01364kqread nginx: worker process(nginx)3626736264nobody0.01364kqread nginx: worker process(nginx)