控制nginx

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

  • 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)

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

应该注意的是,旧的主进程不会关闭其侦听套接字,并且可以管理它以在需要时再次启动其工作进程。如果由于某种原因新的可执行文件无法接受,可以执行以下操作之一:

  • 将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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值