Nginx進(jìn)行平滑升級的實戰(zhàn)指南(不中斷服務(wù)版本更新)
Nginx無縫升級版本,支持及時回滾。
升級目的:解決Nginx漏洞
平滑升級的核心是 不中斷服務(wù) 的前提下,用新版本的 Nginx 替換舊版本。新編譯的 objs/nginx 是新版本的二進(jìn)制文件,需要覆蓋舊的二進(jìn)制文件,以便 Master 進(jìn)程啟動新的 Worker 進(jìn)程時使用新版本。
一.下載并編譯新版Nginx
1.下載解壓
nginx下載找到并下載Nginx最穩(wěn)定版本,通過SSH上傳至服務(wù)器

也可復(fù)制鏈接在服務(wù)器通過wget下載。

wget https://nginx.org/download/nginx-1.28.0.tar.gz
下載安裝至指定目錄后解壓。
cd /home/ngtl/ tar -zxvf nginx-1.28.0.tar.gz cd nginx-1.28.0/

2.編譯
編譯之前需要確定之前版本的Nginx的編譯目錄,和模塊兼容性。找到正在運行的Nginx可執(zhí)行文件并執(zhí)行命令。
/usr/local/nginx/sbin/nginx -V

可以看到從--prefix之后都是執(zhí)行./configure的參數(shù),在新Nginx編譯的時候,參數(shù)必須和要升級的Nginx一樣.
關(guān)鍵步驟:
- 完整復(fù)制 configure arguments: 后的參數(shù)
- 必須保證新版本配置參數(shù)與舊版完全一致
- 特別注意第三方模塊路徑(如 OpenSSL)
然后在剛才解壓的Nginx目錄下執(zhí)行以下命令然后等待:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-stream --with-http_ssl_module --with-openssl=/home/ngtl/openssl-1.1.1l
./configure成功后如下圖:

然后繼續(xù)執(zhí)行make命令,注意這里不要執(zhí)行make insyall,不然會覆蓋原來的配置文件,包括config下面的。
make
執(zhí)行成功以后,會在解壓目錄下生成objs目錄,目錄下會生成需要替換的nginx可執(zhí)行文件。
注意事項:
- 編譯產(chǎn)物路徑:nginx/objs/nginx
- 禁止執(zhí)行 make install 防止覆蓋現(xiàn)有配置
- 出現(xiàn) ./configure: error 需檢查缺失的依賴庫
二.替換可執(zhí)行文件,并平滑升級
1.替換可執(zhí)行文件
備份舊版本方便報錯后回滾
# 備份舊的 Nginx 可執(zhí)行文件 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # 備份配置文件(可選) cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak
替換舊的二進(jìn)制文件
將新編譯的 objs/nginx 復(fù)制到舊版本的安裝目錄中:
cp objs/nginx /usr/local/nginx/sbin/
注意如果此處提示報錯:cp: cannot create regular file ‘/usr/local/nginx/sbin/nginx’: Text file busy。這表明目標(biāo)文件(nginx 可執(zhí)行文件)正在被其他進(jìn)程占用。
解決方法:需要先通過 Nginx 平滑升級流程 處理舊進(jìn)程,確保替換二進(jìn)制文件時不會沖突。
2.進(jìn)行平滑升級處理
發(fā)送信號啟動新版本進(jìn)程
# 獲取舊 Nginx 主進(jìn)程的 PID cat /usr/local/nginx/logs/nginx.pid # 發(fā)送 USR2 信號,啟動新版本的 Master 進(jìn)程 kill -USR2 <上一步的ID>


此時,Nginx 會啟動新的 Master 進(jìn)程,并加載新版本的配置文件(如果上一步為報錯則已經(jīng)替換成功)。舊的 Master 進(jìn)程仍然在運行,但新的 Master 進(jìn)程已經(jīng)啟動。
替換二進(jìn)制文件使用 mv 命令替換或者cp -f強制覆蓋
# 使用 mv 替換(避免 "Text file busy" 錯誤) mv objs/nginx /usr/local/nginx-1.20.1/sbin/
# 強制覆蓋(仍需確保文件未被占用) cp -f objs/nginx /usr/local/nginx-1.20.1/sbin/
優(yōu)雅關(guān)閉舊版本進(jìn)程
# 發(fā)送 WINCH 信號,逐步關(guān)閉舊版本的 Worker 進(jìn)程 kill -WINCH <上一步的ID> # 檢查進(jìn)程狀態(tài)(確認(rèn)舊 Worker 進(jìn)程已退出) ps -ef | grep nginx

此時舊的會話已經(jīng)被新Nignx進(jìn)程替代,在檢查新Nginx不影響業(yè)務(wù)之后,就可以完全停止舊進(jìn)程了
完全關(guān)閉舊版本 Master 進(jìn)程
# 發(fā)送 QUIT 信號,關(guān)閉舊版本 Master 進(jìn)程 kill -QUIT <上一步的ID>
信號作用詳解:
| 信號 | 作用 | 執(zhí)行時機 |
|---|---|---|
| USR2 | 啟動新版本Master進(jìn)程 | 升級第一步 |
| WINCH | 逐步關(guān)閉舊版本W(wǎng)orker進(jìn)程 | 新進(jìn)程正常運行后 |
| QUIT | 優(yōu)雅退出舊Master進(jìn)程 | 業(yè)務(wù)驗證通過后 |
檢查新版本是否運行

驗證版本信息
/usr/local/nginx/sbin/nginx -v

回滾方案(如升級失?。?/h2>
如果新版本出現(xiàn)問題,可以通過以下步驟回滾到舊版本:
恢復(fù)備份文件
cp /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx
重啟舊版本進(jìn)程
# 向新 Master 進(jìn)程發(fā)送 QUIT 信號(關(guān)閉新版本) kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid) # 啟動舊版本 Nginx /usr/local/nginx/sbin/nginx
注意事項
- 確保編譯參數(shù)一致
新版本的 Nginx 必須使用與舊版本相同的編譯參數(shù)(如模塊配置),否則可能導(dǎo)致功能異常。 - 避免直接覆蓋運行中的文件
直接使用cp覆蓋正在運行的 Nginx 二進(jìn)制文件會導(dǎo)致Text file busy錯誤,必須通過平滑升級流程處理。 - 監(jiān)控日志
升級后檢查 Nginx 日志(/usr/local/nginx/logs/),確保無報錯。
以上就是Nginx不中斷服務(wù)實現(xiàn)版本更新的實戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Nginx不中斷服務(wù)版本更新的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
nginx could not build the server_names_hash 解決方法
服務(wù)器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。2011-03-03
阿里云Nginx配置https實現(xiàn)域名訪問項目(圖文教程)
這篇文章主要介紹了阿里云Nginx配置https實現(xiàn)域名訪問項目(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
keepalived+lvs 對nginx做負(fù)載均衡和高可用的操作方法
這篇文章主要介紹了keepalived+lvs 對nginx做負(fù)載均衡和高可用的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-12-12

