nginx平滑升級,不影響線上業務的運行
這里nginx的安裝目錄是:nginx
第一步:查看nginx版本號:
[root@localhost nginx-web]# nginx -v
nginx version: nginx/1.15.12
這里的版本號是1.10.3,對比下官網的版本號:

第二步:下載上傳并解壓nginx安裝包
我這里下載的是1.21.4的版本號 nginx-1.21.4,下載下來后上傳到服務器,
下載地址:nginx: download
解壓命令
tar zxvf nginx-1.21.4.tar.gz
查看解壓后的檔案 ,
[root@localhost nginx_new]# ls -l
total 1048
drwxr-xr-x 9 vsftpd vsftpd 186 Dec 20 17:47 nginx-1.21.4
-rw-r--r-- 1 root root 1070260 Dec 20 17:05 nginx-1.21.4.tar.gz
[root@localhost nginx_new]# cd nginx-1.21.4/
[root@localhost nginx-1.21.4]# ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src
第三步:編譯安裝包
可以看到解壓后的目錄下有 configure

1、 ./configure 是配置相關引數
這里需要了解之前的安裝配置
1、如果配置了nginx全域啟動可以使用 nginx -V查看

2、如果沒有設定全域啟動,到nginx安裝目錄下 找到sbin檔案夾,進入后 使用: ./nginx -V
-v 查看版本號
-V 查看安裝細節
在"./configure"配置中,"--with"表示啟用模塊,也就是說這些模塊在編譯時不會自動構建"--without"表示禁用模塊,也就是說這些模塊在編譯時會自動構建,若你想Nginx輕量級運行,可以去除一些不必要的模塊,
這里可以看到的是 之前的安裝配置比較復雜比較全,直接將 --prefix=一直到最后復制下來,然后使用./configure 執行
./configure --prefix=/usr/local/nginx-web --with-http_ssl_module --with-http_gzip_static_module

如果,配置錯了需要重新配置編譯,這里可以重復執行
2、使用make命令進行編譯
這里是升級不要使用make install,只編譯不安裝
[root@localhost nginx-1.21.4]# make

看到這里說明編譯成功,編譯好的檔案在 objs目錄下
測驗編譯后的程式是否可行:
執行:objs/nginx -t -c /usr/local/nginx-web/conf/nginx.conf,結果如下圖

第四步:替換原有的nginx啟動程式
1、替換nginx的啟動程式之前先做好備份
[root@localhost nginx-web]# mv /usr/local/nginx-web/sbin/nginx /usr/local/nginx-web/sbin/nginx.15.old
2、查看備份結果,備份成功,現在開始準備替換nginx

也可以把組態檔nginx.conf備份下
編譯好的程式在objs目錄下:

3、執行替換,使用cp復制到對應的目錄下就好

這里替換命令報錯,因為我們的nginx正處于啟動狀態
4、查看下 ps -ef | grep nginx,,這里看到行程是10441

第一種:直接kill 干掉行程,進行替換
第二種:發送USR2信號給舊版本主行程號,使nginx的舊版本停止接收請求,用nginx新版本接替,且老行程處理完所有請求,關閉所有連接后,停止后替換

執行命令 kill -USR2 `cat nginx.pid`
kill -USR2 `cat nginx.pid`
查看nginx pid目錄,多了個nginx.pid.oldbin檔案,存放了舊版本nginx的pid號
kill -WINCH `cat nginx.pid.oldbin`
從容關閉舊行程:kill -QUIT `cat nginx.pid.oldbin`
kill -QUIT `cat nginx.pid.oldbin`
[root@localhost logs]# kill -QUIT `cat nginx.pid.oldbin`
[root@localhost logs]# ls
access.log error.log nginx.pid
5、查看版本號 ./nginx -v
[root@localhost sbin]# ./nginx -v
nginx version: nginx/1.21.4
6、執行./nginx -s relaod
7、檢查是否啟動成功
[root@localhost logs]# ps -ef | grep nginx
nobody 3976 27438 0 11:18 ? 00:00:00 nginx: worker process
root 5224 12257 0 11:19 pts/1 00:00:00 grep --color=auto nginx
root 27438 1 0 10:36 ? 00:00:00 nginx: master process ./nginx
[root@localhost logs]# ll /proc/27438/exe
lrwxrwxrwx 1 root root 0 12月 21 10:41 /proc/27438/exe -> /usr/local/nginx-web/sbin/nginx.15.old
[root@localhost logs]# /usr/local/nginx-web/sbin/nginx.15.old -v
nginx version: nginx/1.15.12

可以看到的是這里依然使用的是舊程式,
可以執行以下命令:
[root@localhost logs]# kill -USR2 `cat nginx.pid`
[root@localhost logs]# ls
access.log error.log nginx.pid nginx.pid.oldbin
[root@localhost logs]# kill -WINCH `cat nginx.pid.oldbin`
查看結果:

kill -USR2 的作用: 新執行檔案啟動,生成新行程號,新舊的行程共存!
所以運行 kill -USER2之后,存在nginx.pid 和 nginx.pid.oldbin
kill -WINCH 的作用:新來的請求統統由新程式處理,老的連接還繼續由老程式處理;上圖的結果印證這一說法;
稍等一段時間后,感覺沒有人使用舊程式了,這個時候,時機到了,徹底棄用舊程式;
這個時候再執行:kill -QUIT `cat nginx.pid.oldbin` ,干掉舊的程式
kill -QUIT `cat nginx.pid.oldbin`
這個時候查看的結果如下,說明已經轉到新程式了

說明:如何查找nginx的目錄
方法一:

如果找不到nginx安裝目錄,可以使用 nginx -V尋找nginx的目錄 ,前提是服務器中的nginx是全域命令,可以這樣查找
方法二:
也可以使用:whereis nginx

方法三 使用 ps -ef | grep nginx 和 ll /proc/{PID}/exe

希望能幫助到你,記得點贊!!!謝謝!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/389112.html
標籤:其他
