发送信号控制 nginx

发送信号控制 nginx
====================


编译自:
http://nginx.org/en/docs/control.htmlhtml


目录:
    修改配置
    滚动日志文件
    在运行中升级可执行文件
nginx

 

可经过发送信号给 nginx 对 nginx 进行控制。nginx 主进程的 PID 默认被写入 /usr/local/nginx/logs/nginx.pid。pid 文件的路径可被在配置时修改,可在配置文件中使用 pid 指令指定其余路径。nginx 主进程支持以下信号:bash

    TERM, INT        快速关闭 nginx
    QUIT             优雅地关闭 nginx
    HUP              修改配置,keeping up with a changed time zone (only for FreeBSD and Linux),   
                     以新配置启动新的 worker 进程,优雅地关闭老的 worker 进程。
    USR1             从新打开日志文件
    USR2             升级可执行文件
    WINCH            优雅地关闭 worker 进程

也可发送信号给某个 worker 进程,支持的信号有:并发

    TERM, INT   快速关闭 nginx
    QUIT        优雅地关闭 nginx
    USR1        从新打开日志文件
    WINCH       为调试bug,非正常地关闭 worker 进程(需在配置中使用 debug_points 指令)

 

修改配置
------------

要让 nginx 从新加载配置文件,须要给 nginx 主进程发送一个 HUP 信号。nginx 主进程收到信号以后,首先检查配置的语法,而后尝试应用新配置,好比:打开日志文件,或者创建新的监听套接字。若是应用新配置失败,nginx 对改动进行回滚,并继续以旧的配置进行工做。若是成功,nginx 启动新的 worker 进程,并发送关闭消息给旧的 worker 进程要求它们优雅地关闭。旧的 worker 进程关闭监听套接字,并继续完成当前的用户请求,等用户的请求完成后,就会关闭。咱们以一个例子来演示这个过程,在 Linux 中执行:spa

ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'

该命令生成以下输出:
      
      debug

PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
5638     1 root      0.0  45116 rt_sig nginx: master process nginx
5960  5638 nginx     0.0  45356 ep_pol nginx: worker process


 
当发送一个 HUP 信号给 nginx 主进程调试

kill -s HUP 6538

执行 ps 命令,可看到 worker 进程的 PID 改变了,输出改变为:    
   日志

     PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
    5638     1 root      0.0  45116 rt_sig nginx: master process nginx
    6302  5638 nginx     0.0  45564 ep_pol nginx: worker process

执行 kill -s HUP 6538 的效果与从新加载 nginx 配置的命令相同:
 code

nginx -s reload

 

滚动日志
---------------

滚动日志以前,日志须要被重命名,而后发送 USR1 信号给 nginx 主进程。主进程 re-open 当前全部已经打开的日志文件,并以 worker 进程当前的用户身份,给从新打开的日志文件定义 owner 身份(chown)。成功 re-open 以后,主进程关闭全部打开的日志文件,并发送消息给 worker 进程要求它 re-open 日志文件。worker 进程也会打开新的日志文件,并当即关闭旧的日志文件。以后,对旧的日志文件就能够进行推送处理,好比进行压缩处理。htm

示例:

cd 到日志目录:

[root@lamp1 nginx]# cd /var/log/nginx
[root@lamp1 nginx]# ls
access.log  error.log

重命名 access.log 文件为 access.log.1,执行 nginx -s reopen 命令,查看滚动日志状况:

[root@lamp1 nginx]# mv access.log access.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log

重命名 error.log 文件为 error.log.1,执行 nginx -s reopen 命令,查看滚动日志状况:

[root@lamp1 nginx]# mv error.log error.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log  error.log.1


注:kill -s HUP 与 nginx -s reopen 效果相同。

查看日志文件的属主,为 nginx,nginx 是 worker 进程的执行身份,看看前面“修改配置”小节的 ps 命令输出:

[root@lamp1 nginx]# ll
total 12
-rw-r--r-- 1 nginx root    0 Jun 29 07:58 access.log
-rw-r--r-- 1 nginx root 4055 Jun 28 17:29 access.log.1
-rw-r--r-- 1 nginx root   63 Jun 29 07:59 error.log
-rw-r--r-- 1 nginx root 1260 Jun 29 07:58 error.log.1

 

在运行中升级可执行文件
-----------------------

为升级 nginx 可执行程序,首先将旧的 nginx 可执行文件替换为新的可执行文件,而后发送 USR2 信号给 nginx 主进程。nginx 主进程第一步会重命名 pid 文件,给原来的 pid 文件添加 .oldbin 后缀,好比 /usr/local/nginx/logs/nginx.pid.oldbin,而后启动新 nginx 可执行文件并依次启动新的 worker 进程。

   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)


这时新旧 worker 进程都继续接受请求。若是将 WIHCH 信号发送给第一个主进程,它会发送消息给它的 worker 进程,要求他们优雅地关闭,以后第一个主进程的 worker 进程开始退出:

   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)

应注意的是,旧的主进程不会关闭它的监听套接字,并可在须要时从新启动它的 worker 进程。
若是由于某些缘由新的可执行文件不能正确工做,可采用下列的其中一种方法:
    
    1.发送 HUP 信号给旧的主进程。旧的主进程会启动新的 worker 进程,但不会重读配置文件。以后,可发送 QUIT 信号给新主进程,让全部新主进程的 worker 进程优雅地关闭。
    
    2.发送 TERM 信号给新主进程。新主进程收到 TERM 信号以后,会发送消息给它的 worker 进程,要求他们当即退出,以后这些 worker 进程将当即退出。(若是 worker 进程由于某些缘由不能当即退出,应发送 KILL 信号令其强制性地退出)当新主进程退出后,旧主进程会自动启动新的 worker 进程。

若是新主进程退出,旧主进程会将 pid 文件的 .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)
相关文章
相关标签/搜索