我們先來介紹一些下nginx支援的訊號。下面列出的是主進程可以接收的幾種訊號。
注意:worker行程也可以接收部分訊號,但是它和主行程的訊號處理機制有些不同,主行程支援的訊號worker行程不一定支援。
graceful stop的行為是:(1)程序不再監聽、接受新的請求;(2)程序繼續處理正在處理的請求,但處理完成後銷毀。
1. 升級
如果想對一個已運行的nginx實例進行版本升級,或者因為重新編譯了一個版本而替換舊版本,可以考慮按照以下一系列過程來平穩、安全地升級。當然,如果直接停止服務不會產生多大影響,直接停掉再啟動新版本nginx實例更方便簡單。
1.將新版本的nginx指令路徑取代掉舊的nginx指令。
通常,對於編譯安裝的nginx來說,採用軟連結的方式比較便捷。例如舊版的安裝路徑為/usr/local/nginx-1.12.0,為其建立一個軟連結/usr/local/nginx,如果有新版本/usr/local/nginx-1.12.1,只需修改軟連結/usr/local/nginx的指向目標為/usr/local/nginx-1.12.1即可。這樣/usr/local/nginx/sbin/nginx就會隨著軟連結的指向改變而指向新nginx程式。
2.對舊nginx實例的主程序發送USR2訊號。
kill -USR2 `cat /var/run/nginx/nginx.pid`
此訊號提示nginx舊的主程序要升級,並執行新的nginx程式。例如步驟1中,舊的nginx主進程為/usr/local/nginx/sbin/nginx,但其指向的是/usr/local/nginx-1.12.0/sbin/nginx,發送該訊號後仍將執行/ usr/local/nginx/sbin/nginx,但此時因為軟連結目標已改變,使得此時啟動的nginx已經是/usr/local/nginx-1.12.1/sbin/nginx程式。
此外,發送該訊號後將會切換pid文件,舊的pid檔案被重新命名為nginx.pid.oldbin,記錄的是舊的nginx主進程pid值,新的pid檔為nginx.pid,記錄的是新啟動的nginx的主程序pid值。
[root@xuexi ~]# ls /var/run/nginx* /var/run/nginx.pid /var/run/nginx.pid.oldbin
3.graceful stop舊的主程序編號。 kill -QUIT `cat /var/run/nginx/nginx.pid.oldbin`
向舊的主程序號碼發送QUIT訊號,該訊號將使得主進程以graceful的方式關閉。這將使得舊的主流程、舊的worker進程不再接受任何新請求,但卻會把正在處理過程中的請求處理完畢,然後被銷毀退出。
4.更穩健的方式是先讓worker進程graceful stop,在新版本的nginx實例運行一小段時間後如果正常工作,再graceful stop舊的主進程。
kill -WINCH `cat /var/run/nginx/nginx.pid.oldbin` # a period of time goes, graceful stop old master nginx kill -QUIT `cat /var/run/nginx/nginx.pid.oldbin`
在發送WINCH訊號給舊的主進程後,舊的worker進程將逐漸退出,但舊的主進程會保留不退出。
如果發現新版本的nginx實例不滿意,可以直接向舊主程序號碼發送HUP訊號,這樣舊的主程序就會重新讀取設定檔並fork新的worker進程,再將新的主進程號殺掉(可以graceful stop),就可以還原為舊版的nginx實例。
2.降級
上面第4步其實就是最安全的降級方式。即:
kill -HUP `cat /var/run/nginx/nginx.pid.oldbin` kill -QUIT `cat /var/run/nginx/nginx.pid`
但如果舊的主進程號已經被殺掉了,目前只有新版本的nginx實例在運行,那麼只需以升級的步驟進行降級即可。即:
kill -USR2 `cat /var/run/nginx/nginx.pid` kill -QUIT `cat /var/run/nginx/nginx.pid.oldbin`
3.一鍵升級腳本
以下是升級的腳本。
相關推薦:nginx教學
以上是如何平穩安全地升級nginx版本的詳細內容。更多資訊請關注PHP中文網其他相關文章!