nginx運(yùn)維中怎么樣平滑升級

nginx運(yùn)維中怎么樣平滑升級

可以在不中斷服務(wù)的情況下 – 新的請求也不會丟失,使用新的 nginx 可執(zhí)行程序替換舊的(當(dāng)升級新版本或添加/刪除服務(wù)器模塊時)。 ? ? ? ?( 推薦學(xué)習(xí):nginx運(yùn)維?)

首先,使用新的可執(zhí)行程序替換舊的(最好做好備份),然后,發(fā)送 USR2 (kill -USR2 pid)信號給主進(jìn)程。

主進(jìn)程將重命名它的?.pid?文件為?.oldbin?(比如:/usr/local/nginx/logs/nginx.pid.oldbin),然后執(zhí)行新的可執(zhí)行程序,依次啟動新的主進(jìn)程和新的工作進(jìn)程:

??PID??PPID?USER????%CPU???VSZ?WCHAN??COMMAND 33126?????1?root?????0.0??1164?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 33134?33126?nobody???0.0??1368?kqread?nginx:?worker?process?(nginx) 33135?33126?nobody???0.0??1380?kqread?nginx:?worker?process?(nginx) 33136?33126?nobody???0.0??1368?kqread?nginx:?worker?process?(nginx) 36264?33126?root?????0.0??1148?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 36265?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36266?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36267?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx)

在這時,兩個 nginx 實(shí)例會同時運(yùn)行,一起處理輸入的請求。要逐步停止舊的實(shí)例,你必須發(fā)送 WINCH 信號給舊的主進(jìn)程,然后,它的工作進(jìn)程就將開始從容關(guān)閉:

??PID??PPID?USER????%CPU???VSZ?WCHAN??COMMAND 33126?????1?root?????0.0??1164?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 33135?33126?nobody???0.0??1380?kqread?nginx:?worker?process?is?shutting?down?(nginx) 36264?33126?root?????0.0??1148?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 36265?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36266?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36267?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx)

一段時間后,舊的工作進(jìn)程處理了所有已連接的請求后退出,就僅由新的工作進(jìn)程來處理輸入的請求了:

??PID??PPID?USER????%CPU???VSZ?WCHAN??COMMAND 33126?????1?root?????0.0??1164?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 36264?33126?root?????0.0??1148?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx 36265?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36266?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) 36267?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx)

這時,因為舊的服務(wù)器還尚未關(guān)閉它監(jiān)聽的套接字,所以,通過下面的幾步,你仍可以恢復(fù)舊的服務(wù)器:

發(fā)送 HUP 信號給舊的主進(jìn)程 – 它將在不重載配置文件的情況下啟動它的工作進(jìn)程

發(fā)送 QUIT 信號給新的主進(jìn)程,要求其從容關(guān)閉其工作進(jìn)程

發(fā)送 TERM 信號給新的主進(jìn)程,迫使其退出

如果因為某些原因新的工作進(jìn)程不能退出,向其發(fā)送 KILL 信號

新的主進(jìn)程退出后,舊的主進(jìn)程會由移除 .oldbin 前綴,恢復(fù)為它的 .pid 文件,這樣,一切就都恢復(fù)到升級之前了。

如果嘗試升級成功,而你也希望保留新的服務(wù)器時,發(fā)送 QUIT 信號給舊的主進(jìn)程使其退出而只留下新的服務(wù)器運(yùn)行:

??????PID??PPID?USER????%CPU???VSZ?WCHAN??COMMAND ????36264?????1?root?????0.0??1148?pause??nginx:?master?process?/usr/local/nginx/sbin/nginx ????36265?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) ????36266?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx) ????36267?36264?nobody???0.0??1364?kqread?nginx:?worker?process?(nginx)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊10 分享