控制 nginx

更改配置
轮换日志文件
动态升级可执行文件

nginx 可以通过 signals 进行控制。 默认情况下,主进程的进程 ID 会写入该文件。 可以在配置时或使用 pid 指令更改此名称。 主进程支持以下信号:/usr/local/nginx/logs/nginx.pidnginx.conf

术语、INT快速关机
退出正常关闭
HUP更改配置, 跟上更改的时区(仅适用于 FreeBSD 和 Linux), 使用新配置启动新的 worker 进程, 正常关闭旧的工作进程
USR1重新打开日志文件
USR2升级可执行文件
绞车正常关闭工作进程

单个工作进程也可以通过信号进行控制, 尽管这不是必需的。 支持的信号包括:

术语、INT快速关机
退出正常关闭
USR1重新打开日志文件
绞车调试异常终止 (需要启用 debug_points

更改配置

为了让 nginx 重新读取配置文件,HUP 信号应发送到主进程。 主进程首先检查语法有效性,然后尝试 应用新配置,即打开日志文件和新建 listen sockets 的 Sockets 中。 如果此作失败,它将回滚更改并继续工作 使用旧配置。 如果成功,它将启动新的工作进程,并且 将消息发送到旧的工作进程,请求它们 优雅地关闭。 旧的工作进程关闭侦听套接字并继续服务 老客户。 在所有客户端都得到服务后,旧的工作进程将关闭。

让我们通过示例来说明这一点。 想象一下 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 信号发送到主进程。 然后,主进程将重新打开所有当前打开的日志文件,并且 为他们分配一个非特权用户,工作程序在该用户下处理 作为所有者正在运行。 成功重新打开后,主进程将关闭所有打开的文件,并 将消息发送到 worker 进程,要求它们重新打开文件。 工作进程还会立即打开新文件并关闭旧文件。 因此,旧文件几乎可以立即进行 post 处理,例如压缩。

动态升级可执行文件

为了升级服务器可执行文件,新的可执行文件 应该先代替旧文件。 之后,应将 USR2 信号发送到主进程。 主进程首先将其文件重命名为进程 ID 为 带有后缀的新文件,例如 , 然后启动一个新的可执行文件,而该文件又会启动新的 worker 进程:.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)

一段时间后,只有新的 worker 进程会处理请求:

  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)

应该注意的是,旧的主进程不会关闭其侦听 sockets 中,如果需要,可以管理它以再次启动其 worker 进程。 如果由于某种原因,新的可执行文件无法正常工作,则 可以执行以下作:

  • 将 HUP 信号发送到旧的主进程。 旧的主进程将启动新的工作进程 而无需重新读取配置。 之后,所有新进程都可以正常关闭。 通过将 QUIT 信号发送到新的主进程。

  • 将 TERM 信号发送到新的主进程。 然后,它将向请求它们的工作进程发送消息 立即退出,它们几乎都会立即退出。 (如果新进程由于某种原因未退出, 应该向他们发送 KILL 信号以迫使他们退出。 当新的主进程退出时,旧的主进程将启动新的 worker 进程。

如果新的主进程退出,则旧的主进程将丢弃 文件名中的后缀和进程 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)