一、解釋nginx的平滑升級
隨着nginx越來越流行使用,並且nginx的優勢也越來越明顯,nginx的版本迭代也開始了加速模式,1.9.0版本的nginx更新了許多新功能,例如stream四層代理功能。伴隨着nginx的廣泛應用,版本升級必然是越來越快的,線上業務不能停,此時nginx的升級就是運維的重要工作了,下面就帶大家一起來理解下nginx平滑升級。
二、nginx平滑升級原理
多進程模式下的請求分配方式
Nginx默認工作在多進程模式下,即主進程(master process)啟動后完成配置加載和端口綁定等動作,fork
出指定數量的工作進程(worker process),這些子進程會持有監聽端口的文件描述符(fd),並通過在該描述符上添加監聽事件來接受連接(accept)。
信號的接收和處理
Nginx主進程在啟動完成后會進入等待狀態,負責響應各類系統消息,如SIGCHLD、SIGHUP、SIGUSR2等。
Nginx信號簡介
主進程支持的信號
TERM
,INT
: 立刻退出QUIT
: 等待工作進程結束后再退出KILL
: 強制終止進程HUP
: 重新加載配置文件,使用新的配置啟動工作進程,並逐步關閉舊進程。USR1
: 重新打開日志文件USR2
: 啟動新的主進程,實現熱升級WINCH
: 逐步關閉工作進程
工作進程支持的信號
TERM
,INT
: 立刻退出QUIT
: 等待請求處理結束后再退出USR1
: 重新打開日志文件
三、nginx平滑升級實戰
3.1 備份原Nginx二進制文件
備份二進制文件和nginx的配置文件
[root@iZ28t900vpcZ ~]#cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
[root@iZ28t900vpcZ ~]#cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf_$(date +%F)
3.2 編譯新的nginx源碼包
編譯新Nginx源碼,安裝路徑需與舊版一致
[root@iZ28t900vpcZ nginx-1.9.12]#./configure --prefix=/usr/local/nginx-1.9.12 --user=www --group=www --with-http_ssl_module --with-openssl=/path/to/openssl_src
[root@iZ28t900vpcZ nginx-1.9.12]#make&make install
3.3 發送USR2信號
向主進程發送USR2信號,Nginx會啟動一個新版本的master進程和工作進程,和舊版一起處理請求
[root@iZ28t900vpcZ ~]# ps -ef|grep nginx|grep -v grep
root 900 1 0 Mar07 ? 00:00:00 nginx: master process /usr/local/openresty/nginx/sbin/nginx
nginx 28475 900 0 11:32 ? 00:00:00 nginx: worker process
[root@iZ28t900vpcZ ~]#kill -USR2 900
3.4 發送WITCH信號
向原Nginx主進程發送WINCH信號,它會逐步關閉旗下的工作進程(主進程不退出),這時所有請求都會由新版Nginx處理
[root@iZ28t900vpcZ ~]#kill -WITCH 900
3.5 發送HUP信號
如果這時需要回退,可向原Nginx主進程發送HUP信號,它會重新啟動工作進程, 仍使用舊版配置文件 。然后可以將新版Nginx進程殺死(使用QUIT、TERM、或者KILL)
[root@iZ28t900vpcZ ~]#kill -HUP 900
注:此步驟只需在回滾的時候執行即可
3.6 升級完畢
如果不需要回滾,可以將原Nginx主進程殺死(使用QUIT、TERM、或者KILL),至此完成熱升級。