openresty开发系列3--nginx的平滑升级
openresty開發系列3--nginx的平滑升級
nginx服務器從低版本升級為高版本,如果強行停止服務,會影響正在運行的進程。
平滑升級不會停掉正在運行中的進程,這些進程會繼續處理請求。但不會接受新請求,這些老的進程在處理完請求之后會停止。此平滑升級過程中,新開的進程會被處理。
一)平滑升級
進入nginx可執行程序的目錄
???? #? cd /usr/local/nginx/sbin/
???? # sbin/nginx -v
?????? nginx version: nginx/1.13.0?? ?#查看nginx版本
1)下載高版本nginx
wget http://nginx.org/download/nginx-1.13.2.tar.gz
執行指令生成版本的Nginx二進制程序
#? ./configure
# make??? #不能執行 make install
# cd objs
此目錄下 有高版本的nginx
備份低版本的nginx
cd /usr/local/nginx/sbin/
cp nginx nginx.old
執行強制覆蓋,將低版本的nginx替換為剛編譯好的高版本的nginx
[root@node5 objs]# cp -rfp /usr/local/src/nginx-1.13.2/objs/nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
測試一下新復制過來文件生效情況:
# /usr/local/nginx/sbin/nginx -t
[root@node5 objs]# ps -ef|grep nginx
root????? 43151????? 1? 0 19:40 ???????? 00:00:00 nginx: master process /usr/local//nginx/sbin/nginx
nobody??? 43152? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43153? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43154? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43155? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
root????? 45585? 43080? 0 19:46 pts/1??? 00:00:00 grep --color=auto nginx
[root@node5 objs]# cat /usr/local/nginx/logs/nginx.pid
43151
2)執行信號平滑升級
# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`? 更新配置文件
[root@node5 objs]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
給nginx發送USR2信號后,nginx會將logs/nginx.pid文件重命名為nginx.pid.oldbin,然后用新的可執行文件啟動一個新的nginx主進程和對應的工作進程,并新建一個新的nginx.pid保存新的主進程號
[root@node5 objs]# cat /usr/local/nginx/logs/nginx.pid
45589
3)kill -WINCH 舊的主進程號
舊的主進程號收到WINCH信號后,將舊進程號管理的舊的工作進程優雅的關閉。即一段時間后舊的工作進程全部關閉,只有新的工作進程在處理請求連接。這時,依然可以恢復到舊的進程服務,因為舊的進程的監聽socket還未停止。
處理完后,工作進程會自動關閉
[root@node5 objs]# ps -ef|grep nginx
root????? 43151????? 1? 0 19:40 ???????? 00:00:00 nginx: master process /usr/local//nginx/sbin/nginx
nobody??? 43152? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43153? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43154? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
nobody??? 43155? 43151? 0 19:40 ???????? 00:00:00 nginx: worker process
root????? 45589? 43151? 0 19:46 ???????? 00:00:00 nginx: master process /usr/local//nginx/sbin/nginx
nobody??? 45590? 45589? 0 19:46 ???????? 00:00:00 nginx: worker process
nobody??? 45591? 45589? 0 19:46 ???????? 00:00:00 nginx: worker process
nobody??? 45592? 45589? 0 19:46 ???????? 00:00:00 nginx: worker process
nobody??? 45593? 45589? 0 19:46 ???????? 00:00:00 nginx: worker process
root????? 45595? 43080? 0 19:46 pts/1??? 00:00:00 grep --color=auto nginx
4)# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` 優雅的關閉
給舊的主進程發送QUIT信號后,舊的主進程退出,并移除logs/nginx.pid.oldbin文件,nginx的升級完成。
升級完成了,最后在看一下升級后的版本
查看
[root@node5 objs]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.13.2
已經平滑升級成功
二)中途停止升級,回滾到舊的nginx
在步驟(3)時,如果想回到舊的nginx不再升級
(1)給舊的主進程號發送HUP命令,此時nginx不重新讀取配置文件的情況下重新啟動舊主進程的工作進程。
kill -HUP 43151 --舊主進程號
重啟工作進程
(2)優雅的關閉新的主進程
kill -QUIT 45589? --新主進程號
轉載于:https://www.cnblogs.com/reblue520/p/11428939.html
總結
以上是生活随笔為你收集整理的openresty开发系列3--nginx的平滑升级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openresty开发系列2--ngin
- 下一篇: openresty开发系列4--ngin