平滑升级 nginx

当为在线服务的 nginx 升级或添加模块时,能否可以平滑升级呢。nginx 常更新,开发者应该早就注意到这问题。

查看其 wiki 可以做到。

有 nginx 的 kill 信号机制,关键信号:

USR2 平滑升级可执行程序。
WINCH 从容关闭工作进程
QUIT 从容关闭

1、先发送 USR2 信号,如:


kill -USR2 `cat logs/nginx.pid`
 

kill -USR2 `cat logs/nginx.pid`

此时用 ps -ef | grep nginx 可以看到多了一倍的 nginx 的相关进程。同时 logs 目录下多了一个 nginx.pid.oldbin 文件,记录的是旧的 nginx 主进程的 pid。

2、用 WINCH 信号关闭旧的工作进程


kill -WINCH `cat logs/nginx.pid.oldbin`
 

kill -WINCH `cat logs/nginx.pid.oldbin`

此时,旧的 nginx 主进程还没关闭的,只是旧的 nginx 工作进程关了。如果正常可以执行第3部

3、用 QUIT 信号关闭旧的 nginx 主进程


kill -QUIT `cat logs/nginx.pid.oldbin`
 

kill -QUIT `cat logs/nginx.pid.oldbin`

这样算升级了,新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。

当然在第2部的时候可能发现不对,可以补救,你仍可以恢复旧的服务器:


发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程
发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
发送 TERM 信号给新的主进程,迫使其退出
如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号

你可能感兴趣的:(nginx,liunx,平滑升级)