Nginx不關(guān)機(jī)升級(平滑升級)的實(shí)戰(zhàn)指南
一、升級前的準(zhǔn)備工作
1.1 備份關(guān)鍵數(shù)據(jù)
升級前必須備份Nginx的安裝目錄(如/usr/local/nginx或/data/nginx)、配置文件(如/usr/local/nginx/conf/nginx.conf)及日志文件(如/usr/local/nginx/logs/error.log)。例如:tar -zcvf /data/nginx-backup-$(date +%F).tar.gz /usr/local/nginx/
備份是回滾的核心保障,避免升級失敗導(dǎo)致數(shù)據(jù)丟失。
1.2 確認(rèn)舊版本信息
執(zhí)行以下命令獲取舊版本的編譯參數(shù)(關(guān)鍵!新版本需保持一致)和版本號:
nginx -V
1.3 安裝編譯依賴
確保系統(tǒng)安裝了新版本所需的依賴庫(如gcc、pcre-devel、openssl-devel):dnf install -y gcc make zlib-devel pcre-devel openssl-devel wget # RockyLinux/RHELyum install -y gcc make zlib-devel pcre-devel openssl-devel wget # CentOS
依賴缺失會導(dǎo)致編譯失敗。
二、下載并編譯新版本Nginx
2.1. 下載新版本源碼
訪問Nginx官網(wǎng)(nginx.org/download)下載所需版本(如1.22.0),并解壓:
wget https://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz cd nginx-1.22.0
2.2 編譯新版本
使用舊版本的編譯參數(shù)執(zhí)行configure(避免功能沖突),然后編譯(不要執(zhí)行make install,防止覆蓋舊版本):
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module # 復(fù)用舊參數(shù) make
編譯完成后,新版本的二進(jìn)制文件會生成在objs/nginx目錄下。
三、執(zhí)行平滑升級流程
3.1. 替換舊版本二進(jìn)制文件
將新編譯的objs/nginx復(fù)制到舊版本的安裝目錄(如/usr/local/nginx/sbin/),替換舊的可執(zhí)行文件:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old # 備份舊文件 cp objs/nginx /usr/local/nginx/sbin/nginx # 替換為新文件
若提示Text file busy錯誤,說明舊文件正在被進(jìn)程占用,需先通過后續(xù)步驟停止舊進(jìn)程后再替換。
3.2. 啟動新主進(jìn)程
向舊版本的主進(jìn)程發(fā)送USR2信號,啟動新版本的主進(jìn)程(加載新二進(jìn)制文件),此時新舊版本的主進(jìn)程會同時運(yùn)行:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) # 替換為舊版本的PID
執(zhí)行后,可通過ps -ef | grep nginx查看,此時有兩個主進(jìn)程(舊版本和新版本)。
3.3. 優(yōu)雅關(guān)閉舊工作進(jìn)程
向舊版本的主進(jìn)程發(fā)送WINCH信號,逐步關(guān)閉舊版本的工作進(jìn)程(Worker Process),新版本的工作進(jìn)程會接管請求(確保連接不中斷):
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 替換為舊主進(jìn)程的PID
通過ps -ef | grep nginx確認(rèn)舊工作進(jìn)程已退出,舊主進(jìn)程仍在運(yùn)行(用于回滾)。
3.4. 驗證新版本狀態(tài)
- 檢查新版本是否運(yùn)行:nginx -v(應(yīng)顯示新版本號,如1.29.0);
- 查看日志無報錯:tail -f /usr/local/nginx/logs/error.log;
- 確認(rèn)端口在線:netstat -lntup | grep 80(或監(jiān)聽端口)。
3.5. 結(jié)束舊主進(jìn)程
業(yè)務(wù)驗證無誤后,向舊版本的主進(jìn)程發(fā)送QUIT信號,徹底關(guān)閉舊版本:
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) # 替換為舊主進(jìn)程的PID
再次執(zhí)行ps -ef | grep nginx,確認(rèn)舊進(jìn)程已全部退出,升級完成。
四、升級失敗的回滾操作
若升級后出現(xiàn)異常(如服務(wù)中斷、功能失效),可快速回滾到舊版本:
4.1. 恢復(fù)舊二進(jìn)制文件
將備份的舊版本二進(jìn)制文件復(fù)制回安裝目錄:cp /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx
4.2. 重新加載舊版本
向新版本的主進(jìn)程發(fā)送HUP信號(或直接重啟Nginx),拉起舊版本的工作進(jìn)程:
kill -HUP $(cat /usr/local/nginx/logs/nginx.pid) # 替換為新主進(jìn)程的PID(即舊主進(jìn)程的PID) 或直接重啟: /usr/local/nginx/sbin/nginx
4.3. 清理舊進(jìn)程
若舊主進(jìn)程未自動退出,可發(fā)送QUIT信號關(guān)閉:kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
回滾完成后,再次驗證服務(wù)狀態(tài)。
tar -zcvf /opt/nginx-$(date +%F).tar.gz /usr/local/nginx/ #備份文件目錄+時間 //需要備份的文件目錄 wget https://nginx.org/download/nginx-1.22.0.tar.gz tar -zxvf nginx-1.22.0.tar.gz #解壓縮 ./configure \ > --prefix=/usr/local/nginx \ > --user=nginx \ > --group=nginx \ > --with-http_stub_status_module \ > --with-http_ssl_module #備份 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak #編譯 make #新文件替換到舊文件路徑 cp objs/nginx /usr/local/nginx/sbin/nginx # kill -USR2 $(cat /usr/local/nginxlog/nginx.pid) kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin) kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)



關(guān)鍵注意事項
- 編譯參數(shù)一致性:新版本必須使用與舊版本完全相同的configure參數(shù)(可新增參數(shù),但不能刪除原有模塊參數(shù)),否則會導(dǎo)致功能異常;
- 避免覆蓋運(yùn)行文件:不要直接使用cp覆蓋正在運(yùn)行的二進(jìn)制文件,需通過平滑升級流程處理;
- 監(jiān)控系統(tǒng)資源:新舊版本同時運(yùn)行時會占用雙倍內(nèi)存,確保服務(wù)器資源充足;
- 測試環(huán)境驗證:生產(chǎn)環(huán)境升級前,務(wù)必在測試環(huán)境完成全流程驗證,避免突發(fā)問題。
./configure \
--prefix=/usr/local/nginx \ # 安裝目錄
--user=nginx \ # 運(yùn)行用戶(后續(xù)會創(chuàng)建)
--group=nginx \ # 運(yùn)行用戶組
--with-http_ssl_module \ # 啟用 HTTPS 模塊
--with-http_v2_module \ # 啟用 HTTP/2 協(xié)議(提升性能)
--with-http_gzip_static_module \ # 啟用靜態(tài) gzip 壓縮
--with-http_stub_status_module \ # 啟用狀態(tài)監(jiān)控模塊
--with-pcre \ # 啟用 PCRE 正則支持(rewrite 依賴)
--with-stream \ # 啟用 TCP 代理模塊(如反向代理數(shù)據(jù)庫)
--with-stream_ssl_module \ # 啟用 TCP 代理的 SSL 支持
--http-log-path=/var/log/nginx/access.log \ # 訪問日志路徑
--error-log-path=/var/log/nginx/error.log \ # 錯誤日志路徑
--pid-path=/var/run/nginx/nginx.pid \ # PID 文件路徑
--lock-path=/var/lock/nginx.lock # 鎖文件路徑
注意:
可根據(jù)需求增減模塊(如 --without-xxx 禁用不需要的模塊)
企業(yè)若需特殊模塊(如第三方緩存模塊),可通過 --add-module 引入
到此這篇關(guān)于Nginx不關(guān)機(jī)升級(平滑升級)的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Nginx不關(guān)機(jī)升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
centos系統(tǒng)下LNMP環(huán)境一鍵安裝
centos下的LNMP環(huán)境一鍵安裝實(shí)現(xiàn)方法,需要的朋友可以參考下。2010-06-06
Nginx轉(zhuǎn)發(fā)丟失cookie表現(xiàn)形式及解決方案
本文主要介紹了Nginx轉(zhuǎn)發(fā)丟失cookie表現(xiàn)形式及解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
負(fù)載均衡下的webshell上傳+nginx解析漏洞的過程
這篇文章主要介紹了負(fù)載均衡下的webshell上傳+nginx解析漏洞,首先介紹了負(fù)載均衡下webshell上傳的四大難點(diǎn)及環(huán)境搭建教程,感興趣的朋友跟隨小編一起看看吧2024-02-02

