Nginx進(jìn)行平滑升級(jí)的實(shí)戰(zhàn)指南(不中斷服務(wù)版本更新)
Nginx無縫升級(jí)版本,支持及時(shí)回滾。
升級(jí)目的:解決Nginx漏洞
平滑升級(jí)的核心是 不中斷服務(wù) 的前提下,用新版本的 Nginx 替換舊版本。新編譯的 objs/nginx 是新版本的二進(jìn)制文件,需要覆蓋舊的二進(jìn)制文件,以便 Master 進(jìn)程啟動(dòng)新的 Worker 進(jìn)程時(shí)使用新版本。
一.下載并編譯新版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
的編譯目錄,和模塊兼容性。找到正在運(yùn)行的Nginx可執(zhí)行文件并執(zhí)行命令。
/usr/local/nginx/sbin/nginx -V
可以看到從--prefix
之后都是執(zhí)行./configure
的參數(shù),在新Nginx
編譯的時(shí)候,參數(shù)必須和要升級(jí)的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
,不然會(huì)覆蓋原來的配置文件,包括config
下面的。
make
執(zhí)行成功以后,會(huì)在解壓目錄下生成objs
目錄,目錄下會(huì)生成需要替換的nginx
可執(zhí)行文件。
注意事項(xiàng):
- 編譯產(chǎn)物路徑:nginx/objs/nginx
- 禁止執(zhí)行 make install 防止覆蓋現(xiàn)有配置
- 出現(xiàn) ./configure: error 需檢查缺失的依賴庫
二.替換可執(zhí)行文件,并平滑升級(jí)
1.替換可執(zhí)行文件
備份舊版本方便報(bào)錯(cuò)后回滾
# 備份舊的 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/
注意如果此處提示報(bào)錯(cuò):cp: cannot create regular file ‘/usr/local/nginx/sbin/nginx’: Text file busy。這表明目標(biāo)文件(nginx 可執(zhí)行文件)正在被其他進(jìn)程占用。
解決方法:需要先通過 Nginx 平滑升級(jí)流程 處理舊進(jìn)程,確保替換二進(jìn)制文件時(shí)不會(huì)沖突。
2.進(jìn)行平滑升級(jí)處理
發(fā)送信號(hào)啟動(dòng)新版本進(jìn)程
# 獲取舊 Nginx 主進(jìn)程的 PID cat /usr/local/nginx/logs/nginx.pid # 發(fā)送 USR2 信號(hào),啟動(dòng)新版本的 Master 進(jìn)程 kill -USR2 <上一步的ID>
此時(shí),Nginx 會(huì)啟動(dòng)新的 Master 進(jìn)程,并加載新版本的配置文件(如果上一步為報(bào)錯(cuò)則已經(jīng)替換成功)。舊的 Master 進(jìn)程仍然在運(yùn)行,但新的 Master 進(jìn)程已經(jīng)啟動(dòng)。
替換二進(jìn)制文件使用 mv
命令替換或者cp -f
強(qiáng)制覆蓋
# 使用 mv 替換(避免 "Text file busy" 錯(cuò)誤) mv objs/nginx /usr/local/nginx-1.20.1/sbin/
# 強(qiáng)制覆蓋(仍需確保文件未被占用) cp -f objs/nginx /usr/local/nginx-1.20.1/sbin/
優(yōu)雅關(guān)閉舊版本進(jìn)程
# 發(fā)送 WINCH 信號(hào),逐步關(guān)閉舊版本的 Worker 進(jìn)程 kill -WINCH <上一步的ID> # 檢查進(jìn)程狀態(tài)(確認(rèn)舊 Worker 進(jìn)程已退出) ps -ef | grep nginx
此時(shí)舊的會(huì)話已經(jīng)被新Nignx
進(jìn)程替代,在檢查新Nginx
不影響業(yè)務(wù)之后,就可以完全停止舊進(jìn)程了
完全關(guān)閉舊版本 Master 進(jìn)程
# 發(fā)送 QUIT 信號(hào),關(guān)閉舊版本 Master 進(jìn)程 kill -QUIT <上一步的ID>
信號(hào)作用詳解:
信號(hào) | 作用 | 執(zhí)行時(shí)機(jī) |
---|---|---|
USR2 | 啟動(dòng)新版本Master進(jìn)程 | 升級(jí)第一步 |
WINCH | 逐步關(guān)閉舊版本W(wǎng)orker進(jìn)程 | 新進(jìn)程正常運(yùn)行后 |
QUIT | 優(yōu)雅退出舊Master進(jìn)程 | 業(yè)務(wù)驗(yàn)證通過后 |
檢查新版本是否運(yùn)行
驗(yàn)證版本信息
/usr/local/nginx/sbin/nginx -v
回滾方案(如升級(jí)失?。?/h2>
如果新版本出現(xiàn)問題,可以通過以下步驟回滾到舊版本:
恢復(fù)備份文件
cp /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx
重啟舊版本進(jìn)程
# 向新 Master 進(jìn)程發(fā)送 QUIT 信號(hào)(關(guān)閉新版本) kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid) # 啟動(dòng)舊版本 Nginx /usr/local/nginx/sbin/nginx
注意事項(xiàng)
- 確保編譯參數(shù)一致
新版本的 Nginx 必須使用與舊版本相同的編譯參數(shù)(如模塊配置),否則可能導(dǎo)致功能異常。 - 避免直接覆蓋運(yùn)行中的文件
直接使用cp
覆蓋正在運(yùn)行的 Nginx 二進(jìn)制文件會(huì)導(dǎo)致Text file busy
錯(cuò)誤,必須通過平滑升級(jí)流程處理。 - 監(jiān)控日志
升級(jí)后檢查 Nginx 日志(/usr/local/nginx/logs/
),確保無報(bào)錯(cuò)。
以上就是Nginx不中斷服務(wù)實(shí)現(xiàn)版本更新的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Nginx不中斷服務(wù)版本更新的資料請(qǐng)關(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-03Nginx+Tomcat群集的實(shí)現(xiàn)示例
這篇文章主要介紹了Nginx+Tomcat群集的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程)
這篇文章主要介紹了阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09keepalived+lvs 對(duì)nginx做負(fù)載均衡和高可用的操作方法
這篇文章主要介紹了keepalived+lvs 對(duì)nginx做負(fù)載均衡和高可用的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12