控制 Nginx

Changing Configuration
Rotating Log-files
Upgrading Executable on the Fly

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

学期,INT快速关机
辞职优雅关闭
哈普更改配置、跟上更改的时区(仅适用于 FreeBSD 和 Linux)、使用新配置启动新工作进程、正常关闭旧工作进程
USR1重新打开日志文件
USR2升级可执行文件
绞盘正常关闭工作进程

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

学期,INT快速关机
辞职优雅关闭
USR1重新打开日志文件
绞盘调试异常终止(需要启用 debug_points )

更改配置

为了让nginx重新读取配置文件,应该向master进程发送一个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)

应该注意的是,旧的主进程不会关闭其侦听套接字,如果需要,可以重新启动其工作进程。如果由于某种原因新的可执行文件无法正常工作,可以执行以下操作之一:

如果新的主进程退出,则旧的主进程将丢弃.oldbin文件名中带有进程 ID 的后缀。

如果升级成功,则应将 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)