周末吃飯,我的老同事問我nginx的平滑升級會么?我頓時想起來了之前面試過的一道題,考的就是這個問題。我之前的確也是操作過nginx的升級,但是因?yàn)闇y試環(huán)境的訪問量不大,只是簡單的把nginx二進(jìn)制文件覆蓋,并進(jìn)行了nginx的重啟,也就實(shí)現(xiàn)了升級。但是線上的nginx有那么多用戶訪問,需要在不影響訪問的情況下,進(jìn)行平滑升級。回到家登錄了nginx的官網(wǎng)查了一下,人家寫的清清楚楚,那就記錄下來吧!
獲取nginx的configure選項(xiàng),有助于進(jìn)行編譯。
sbin/nginx -V備份舊的nginx二進(jìn)制文件,復(fù)制新的nginx二進(jìn)制文件。
mv sbin/nginx nginx.old
cp nginx sbin/nginx測試新的nginx二進(jìn)制文件是否正常。
sbin/nginx -t -c nginx.conf平滑升級nginx的操作
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
master process 會重命名.pid為 .oldbin,執(zhí)行新的nginx二進(jìn)制文件,啟動新的master process和新的worker process。
這時,2個nginx實(shí)例一起運(yùn)行,共同處理訪問請求,為了讓舊的nginx逐步退出,可以使用WINCH信號。
kill –WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
經(jīng)過一段等待時間,舊的worker process 全部關(guān)閉,新的worker process 處理所有的訪問請求。這時,依然可以回滾到舊版本的nginx
Send HUP signal to the old master process - it will start the worker processes without reloading a configuration file
Send QUIT signal to the new master process to gracefully shut down its worker processes
Send TERM signal to the new master process to force it quit
If for some reason new worker processes do not quit, send KILL signal to them
After new master process quits, the old master process removes .oldbin suffix from its .pid file, and everything is exactly as before the upgrade attempt.
上面是官方給出的操作步驟,我翻譯如下,
發(fā)送HUP 信號給舊的master process;
發(fā)送QUIT 信號給新的master process,從容關(guān)閉它的worker processes;
發(fā)送TERM 信號給新的master process, 強(qiáng)迫關(guān)閉;
如果一些原因新的worker process沒有關(guān)閉,發(fā)送KILL 信號給它;
新的master process 關(guān)閉后,舊的master process 刪除.oldbin后綴,這樣就恢復(fù)到升級前的狀態(tài)了。
6.如果升級完畢,想保留新的nginx二進(jìn)制文件,發(fā)送QUIT信號給舊的master process,留下新的運(yùn)行,結(jié)束!
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`