nginx信号量控制命令

来源:互联网 发布:页游广告知乎 编辑:程序博客网 时间:2024/05/22 11:33
概述:使用信号量控制nginx,主进程的ID默认在 /usr/local/nginx/logs/nginx.pid,这个可以在配置文件中进行修改。

一、主进程支持以下信号量的控制:
TERM, INT快速强制关闭worker进程主进程退出QUIT优美的关闭worker进程后主进程退出HUP修改配置信息,平滑关闭worker进程,启动新的worker进程USR1重新打开日志文件USR2升级可执行文件WINCH优美的关闭worker进程



二、子进程支持以下信号量的控制:
TERM, INT快速强制关闭worker进程QUIT优美的关闭worker进程USR1重新打开日志文件WINCH调试信号量abnormal termination for debugging (requires debug_points to be enabled)



具体应用

一、修改配置文件
     1、给master进程发送HUP信号,KILL -SIGHUP PID即可
     2、master检查配置文件语法是否正确
     3、master载入新的配置文件
     4、重新打开log文件,根据配置文件创建新的socket监听,如果失败了,则会回滚并且使用之前的配置文件,[源码中的old_cycle,cycle ]
     5、启动新的worker进程,并且给旧的子进程发送消息,旧的子进程关闭监听,在处理完请求后优美的关闭。类似QUIT信号量。在一个while循环后退出。
      
     流程举例:
              1、查看当前进程:
                    
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)

              2、平滑重启信号发送给master(手速快一点,可以看到等待退出的进程)
                   
kill -sighup pid

  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)

          等待一段时间后,旧的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  1368 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)


二、重置日志文件
     1、日志文件重命名
     2、发送USR1信号量给master
     3、master重新打开新的日志文件,并且新的日志文件拥有者为运行worker进程的普通用户
     4、主进程通知所有子进程重新打开日志文件,并且正确关闭所有旧的文件。
     5、然后你就可以对旧的日志文件进行处理了, 比如压缩等操作。



三、升级可执行文件
     1、首先先替换可执行文件
     2、给master进程发送USR2信号量
     3、master进程首先重命名旧的PID文件,比如 /usr/local/nginx/logs/nginx.pid.oldbin
     4、然后master会fork一个新的master进程,按顺序启动worker等步骤
   5、旧的worker进程依次退出,旧的master并不会退出,

举例:
     1、给master发送 USR2信号量,查看进程情况
kill -SIGUSR2 pid
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  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)
          2、过几秒再次查看,发送旧的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)
        3、最后我们再查看一次
  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)
      注意事项:旧的master并不会关闭他所监听的端口,并且它可以重新启动旧的worker进程,如果由于某些原因新版的可执行文件不能很好的运行,一下这些步骤可以回滚。
     方法一:
          1、发送HUP信号给旧的master进程,它会重新启动worker,并且不会更新配置文件
          2、发送QUIT信号给新的worker进程,它会优美得关闭掉新启动的worker进程。
     方法二:
          1、发送TERM信号给新的master进程,它会给让新的worker进程退出(如果不行,直接KILL -9),
          2、然后旧的master进程会启动新的worker进程来接收请求。


     4、如果新的进程启动成功了,我们需要给旧的master发送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)















           




原创粉丝点击