本文共 3420 字,大约阅读时间需要 11 分钟。
可以在不中断服务的情况下 - 新的请求也不会丢失,使用新的 nginx 可执行程序替换旧的(当升级新版本或添加/删除服务器模块时)。
首先,使用新的可执行程序替换旧的(最好做好备份),然后,发送 USR2 (kill -USR2 pid)信号给主进程:
#kill -USR2 15023
主进程将重命名它的进程文件 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新的可执行程序,依次启动新的主进程和新的工作进程:
# ll /usr/local/nginx/total 5136drwx------. 2 nobody root 6 May 9 05:51 client_body_temp-rw-r--r--. 1 root root 1077 May 9 05:50 fastcgi.conf-rw-r--r--. 1 root root 1077 May 9 05:50 fastcgi.conf.default-rw-r--r--. 1 root root 1007 May 9 05:50 fastcgi_params-rw-r--r--. 1 root root 1007 May 9 05:50 fastcgi_params.defaultdrwx------. 2 nobody root 6 May 9 05:51 fastcgi_tempdrwxr-xr-x. 2 root root 38 May 9 05:50 html-rw-r--r--. 1 root root 2837 May 9 05:50 koi-utf-rw-r--r--. 1 root root 2223 May 9 05:50 koi-windrwxr-xr-x. 2 root root 39 May 9 05:51 logs-rw-r--r--. 1 root root 3957 May 9 05:50 mime.types-rw-r--r--. 1 root root 3957 May 9 05:50 mime.types.default-rwxr-xr-x. 1 root root 5187458 May 9 05:50 nginx-rw-r--r--. 1 root root 2656 May 9 05:50 nginx.conf-rw-r--r--. 1 root root 2656 May 9 05:50 nginx.conf.default-rw-r--r--. 1 root root 6 May 9 19:32 nginx.pid-rw-r--r--. 1 root root 6 May 9 19:28 nginx.pid.oldbin #这里drwx------. 2 nobody root 6 May 9 05:51 proxy_temp-rw-r--r--. 1 root root 636 May 9 05:50 scgi_params-rw-r--r--. 1 root root 636 May 9 05:50 scgi_params.defaultdrwx------. 2 nobody root 6 May 9 05:51 scgi_temp-rw-r--r--. 1 root root 664 May 9 05:50 uwsgi_params-rw-r--r--. 1 root root 664 May 9 05:50 uwsgi_params.defaultdrwx------. 2 nobody root 6 May 9 05:51 uwsgi_temp# ps -ef | grep nginxroot 15023 1 0 19:28 ? 00:00:00 nginx: master process /usr/local/nginx/nginx #原进程nobody 15027 15023 0 19:28 ? 00:00:00 nginx: worker processroot 15130 15023 0 19:32 ? 00:00:00 nginx: master process /usr/local/nginx/nginx #新进程nobody 15131 15130 0 19:32 ? 00:00:00 nginx: worker processroot 15137 14935 0 19:32 pts/1 00:00:00 grep --color=auto nginx
在这时,两个 nginx 实例会同时运行,一起处理输入的请求。
要逐步停止旧的实例,你必须发送 WINCH 信号给旧的主进程,然后,它的工作进程就将开始从容关闭:
#kill -WINCH 15023# ps -ef | grep nginxroot 15023 1 0 19:28 ? 00:00:00 nginx: master process /usr/local/nginx/nginx nobody 15027 15023 0 19:28 ? 00:00:00 nginx: worker process is shuting down (nginx) root 15130 15023 0 19:32 ? 00:00:00 nginx: master process /usr/local/nginx/nginxnobody 15131 15130 0 19:32 ? 00:00:00 nginx: worker process 一段时间后,旧的工作进程处理了所有已连接的请求后退出,就仅由新的工作进程来处理输入的请求了: ps -ef | grep nginxroot 15023 1 0 19:28 ? 00:00:00 nginx: master process /usr/local/nginx/nginxroot 15130 15023 0 19:32 ? 00:00:00 nginx: master process /usr/local/nginx/nginxnobody 15131 15130 0 19:32 ? 00:00:00 nginx: worker processroot 15176 14935 0 19:35 pts/1 00:00:00 grep --color=auto nginx 这时,因为旧的服务器还尚未关闭它监听的套接字,所以,通过下面的几步,你仍可以恢复旧的服务器: 1)发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程 # kill -HUP 15023 2)发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程 #kill -QUIT 15130 3)如果新主进程还没退出,发送 TERM 信号给新的主进程,迫使其退出 #kill -TERM 15130 4)如果因为某些原因新的工作进程不能退出,向其发送 KILL 信号 #kill -9 15130 新的主进程退出后,旧的主进程会由移除 .oldbin 前缀,恢复为它的 .pid 文件,这样,一切就都恢复到升级之前了。 如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT 信号给旧的主进程使其退出而只留下新的服务器运行:#kill -QUIT 15023
转载地址:http://ldxgi.baihongyu.com/