nginx 不中斷服務 平滑升級
阿新 • • 發佈:2018-12-31
可以在不中斷服務的情況下 - 新的請求也不會丟失,使用新的 nginx 可執行程式替換舊的(當升級新版本或新增/刪除伺服器模組時)。
首先,使用新的可執行程式替換舊的(最好做好備份),然後,傳送 USR2 (kill -USR2 pid)訊號給主程序:
#kill -USR2 15023
主程序將重新命名它的程序檔案.pid檔案為.oldbin(比如:/usr/local/nginx/logs/nginx.pid.oldbin),然後執行新的可執行程式,依次啟動新的主程序和新的工作程序:
# ll /usr/local/nginx/ total 5136 drwx------. 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.default drwx------. 2 nobody root 6 May 9 05:51 fastcgi_temp drwxr-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-win drwxr-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.default drwx------. 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.default drwx------. 2 nobody root 6 May 9 05:51 uwsgi_temp # ps -ef | grep nginx root 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 root 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 process root 15137 14935 0 19:32 pts/1 00:00:00 grep --color=auto nginx
在這時,兩個 nginx 例項會同時執行,一起處理輸入的請求。
要逐步停止舊的例項,你必須傳送 WINCH 訊號給舊的主程序,然後,它的工作程序就將開始從容關閉:
#kill -WINCH 15023
# ps -ef | grep nginx
root 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 processis 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 nginx root 15023 1 0 19:28 ? 00:00:00 nginx: master process /usr/local/nginx/nginx root 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 process root 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