nginx 不中斷服務 平滑公升級

2021-07-31 21:01:07 字數 4065 閱讀 5672

可以在不中斷服務的情況下 - 新的請求也不會丟失,使用新的 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/nginxnobody    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 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

nginx平滑公升級

先來說下我今天要實驗nginx平滑公升級的環境,從nginx.1.8.0公升級到nginx1.9.5 大概的流程 nginx的程序分為master主程序和work工作程序,master程序主要管理事件訊號接受和分發,所有的請求處理都由work程序處理並返回結 果,nginx的平滑重啟或過載配置檔案等...

Nginx平滑公升級

原文 來自nginx官網 如果想要公升級nginx版本 或者在原本版上增加 刪除模組 同時保持服務不間斷,採用如下方式可滿足要求。1.使用新的二進位制檔案替換老的二進位制檔案,這需要注意的是nginx原始碼在執行make編譯後,不要直接make install,否則可能會覆蓋其他配置檔案,命令如下 ...

Nginx平滑公升級

有時,我們需要對我們的伺服器進行公升級更高版本。此時,如果我們強行將伺服器停止然後直接公升級,這樣原來在伺服器上執行著的程序就會被影響。如何解決這個問題呢?可以通過平滑公升級的方式來解決。平滑公升級時,不會停掉在執行著的程序,這些程序會繼續處理請求,但不會再接受新請求,在這些老程序在處理完還在處理的...