概述:使用信号量控制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)