1. 平滑升級
爲什麼要平滑升級呢?
如果我們想要更新nginx,但它的更新也要耗費一定的時間。而平滑升級可以做到在線升級,保證不影響客戶的使用,並且升級後新版本對服務端的數據也不會覆蓋。
step1 需要兩個不同版本的nginx安裝包:
這裏我的是:nginx-1.14.2.tar.gz nginx-1.16.1.tar.gz
step2 先安裝一個版本較低的nginx:
tar zxf nginx-1.14.2.tar.gz
yum install gcc openssl-devel pcre-devel -y
cd nginx-1.14.2
./configure --prefix=/usr/local/nginx
make && make install
step3 開啓nginx:
cd /usr/local/nginx/sbin/
./nginx
netstat -antlp | grep nginx #查看端口信息
/usr/local/nginx/sbin/nginx -v #查看版本信息
/usr/local/nginx/sbin/nginx -V #查看編譯信息
step4 將之前的啓動腳本備份:
cp nginx nginx.old
step5 編譯安裝另一個安裝包:
tar zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx #根據老版本的編譯選項對新版本進行編譯
make #make結束不要make install
step6 覆蓋老版本的啓動腳本:
cd /usr/local/nginx/sbin/
cp -f /root/nginx-1.16.1/objs/nginx . #覆蓋老版本的啓動腳本
step7 向原來的nginx的master進程發送信號,不再接受新的請求:
新的nginx程序開啓worker進程,並且開始接收請求:
ps -ef | grep nginx | grep -v grep #查看進程
kill -USR2 4667 #4667爲nginx老進程的pid
kill -WINCH 4667
注意:此時原來的nginx的master並沒有宕掉,只是不在接收請求,當有需要時,我們可以喚醒它
step8 測試:
/usr/local/nginx/sbin/nginx -v #升級成功
/usr/local/nginx/sbin/nginx -V
注意:
在編譯新版本的時候configure make結束不要make install,這會覆蓋原來的nginx
此處只進行編譯步驟(make)不執行安裝步驟(make install)因爲make install命令的本質就是將編譯好的文件複製到對應的目錄中。所以此處省略make install以防止某些老的配置文件被覆蓋,我們只是爲了升級nginx,原來的配置需要保持不變,所以要確保配文件不會被覆蓋。不要製作軟鏈接
使用這種方法有一個前提:就是你在啓動nginx時使用的是nginx二進制文件的絕對路徑,而不是直接在命令行中輸入"nginx"的方式啓動的nginx服務,如果沒有通過絕對路徑啓動nginx那麼當你向nginx進程中發送更新的信號時,nginx進程可能會無法找到新的二進制程序
2. 版本回退
step1 先還原nginx腳本:
cd /usr/local/nginx/sbin
cp -f nginx.old nginx
step2 重新喚起舊版本的master進程,讓其接收請求:
ps -ef | grep nginx | grep -v grep
kill -HUP 4667
step3 讓新版本的master進程不再接收請求,關閉worker進程:
kill -USR2 7197
kill -WINCH 7197
注意:這裏一定要分清除新老版本的進程pid
step4 測試:
查看nginx版本,回退到舊版本:
/usr/local/nginx/sbin/nginx -v
/usr/local/nginx/sbin/nginx -V