1. 程式人生 > 實用技巧 >Nginx--平滑升級

Nginx--平滑升級

在不中斷服務的情況下,新的請求也不會丟失,使用新的 nginx 可執行程式替換舊的

1檢視老版本的編譯選項

[root@localhost ~]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --with-http_realip_module --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module

2編譯新版

[root@localhost ~]# cd nginx-1.18.0/
[root@localhost nginx-1.18.0]# ./ configure --with-http_realip_module --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
[root@localhost nginx-1.18.0]# make && make install

3用新編譯的命令替換原來的命令

[root@localhost nginx-1.18.0]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
[root@localhost nginx
-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/

4啟用新的關閉舊的

[root@localhost nginx-1.18.0]# kill -USR2 \`cat /usr/local/nginx/logs/nginx.pid`
#主程序將重新命名它的.pid檔案為.oldbin 然後執行新的可執行程式,依次啟動新的主程序和新的工作程序

[root@localhost nginx-1.18.0]# kill -WINCH \`cat /usr/local/nginx/logs/nginx.pid.oldbin`
#給舊的主進發WINCH訊號,把舊的主程序關閉,把所有請求轉到新的主程序,但是原有的請求不會中斷,有新請求的時候發到新程序
#這時,因為舊的伺服器還尚未關閉它監聽的套接字,所以,通過下面的幾步,仍可以恢復舊的伺服器:
1.傳送 HUP 訊號給舊的主程序 - 它將在不過載配置檔案的情況下啟動它的工作程序 2.傳送 QUIT 訊號給新的主程序,要求其從容關閉其工作程序 3.傳送 TERM 訊號給新的主程序,迫使其退出 4.如果因為某些原因新的工作程序不能退出,向其傳送 KILL 訊號 #新的主程序退出後,舊的主程序會由移除 .oldbin 字首,恢復為它的 .pid 檔案,這樣,一切就都恢復到升級之前了 #如果嘗試升級成功,但也希望保留新的伺服器時,傳送 QUIT 訊號給舊的主程序使其退出而只留下新的伺服器執行 [root@localhost nginx-1.18.0]# kill -QUIT \`cat /usr/local/nginx/logs/nginx.pid.oldbin`

 kill 訊號

TERM, INT 快速關閉 
QUIT 從容關閉,關閉主程序順便關閉工作子程序
HUP 過載配置用新的配置開始新的工作程序從容關閉舊的工作程序 
USR1 重新開啟日誌檔案 
USR2 平滑升級可執行程式
WINCH 從容關閉工作程序,不會立即關閉子程序