Nginx在線服務狀態下平滑升級或新增模塊


  nginx在使用過程中,有時需要在不影響當前業務的情況下,進行升級或新增模塊。nginx的升級有兩種方法:1.半自動化升級;2.手動升級

  不過都需要先查看安裝的nginx版本和配置信息,然后前往官網下載所需的版本,並上傳

[root@youxi1 ~]# nginx -V
nginx version: nginx/1.14.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module
 --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx

  下載地址:http://nginx.org/en/download.html

一、半自動化升級

  半自動化升級,其實就是在最后遷移的時候不使用make install,而使用源碼自帶的升級命令make upgrade來自動完成。

(1).解壓文件,並編譯(只編譯不安裝)

  只編譯不安裝。./configure后面的參數可以保持一致,也可以改動;另外我這里指定了--with-pcre,需要保證后面的參數存在。

[root@youxi1 ~]# tar zxf nginx-1.16.0.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/nginx-1.16.0/
[root@youxi1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx
[root@youxi1 nginx-1.16.0]# make -j 4  //這里指定的是CPU內核數量,加快編譯速度
[root@youxi1 nginx-1.16.0]# echo $?
0

(2).備份舊的二進制文件,復制新的二進制文件到nginx目錄

[root@youxi1 nginx-1.16.0]# mv /usr/local/nginx/sbin/nginx{,.old}  //備份
[root@youxi1 nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/  //復制

(3).執行升級語句

[root@youxi1 nginx-1.16.0]# make upgrade
/usr/local/nginx/sbin/nginx -t  //查看配置文件是否正確,這里使用的是剛復制過來的nginx二進制文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`  //發送平滑遷移信號給舊的nginx進程
sleep 1  //等待1秒
test -f /usr/local/nginx/logs/nginx.pid.oldbin  //檢測舊的nginx.pid進程是否變為nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`  //結束工作進程,完成此次升級

  test -f [文件]如果為一個普通文件,則為真。這里用來判斷文件是否存在。

  手動升級其實就是使用打印出來的這些語句,加上kill –WINCH `cat /usr/local/nginx/log/nginx.pid.oldbin`(從容關閉nginx.pid.oldbin)和kill –HUP `cat /url/local/nginx/log/nginx.pid.oldbin`(不重啟舊的nginx進程)。

(4).檢測是否升級成功

  首先看看是否正在運行

[root@youxi1 nginx-1.16.0]# ps aux | grep nginx  //查看是否正常運行,如果之前就能使用systemctl,也可以使用systemctl查看
nginx      1338  0.0  0.1 216972  6244 ?        S    13:08   0:00 php-fpm: pool www
nginx      1340  0.0  0.1 216972  6244 ?        S    13:08   0:00 php-fpm: pool www
root       7556  0.0  0.0  18252  1728 ?        S    17:05   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      7557  0.0  0.0  18624  1360 ?        S    17:05   0:00 nginx: worker process
root       7563  0.0  0.0 112724   988 pts/0    S+   17:06   0:00 grep --color=auto nginx

  接着看看配置文件是否有錯,還有nginx的版本和配置選項信息。我能直接使用nginx是因為配置了環境變量。

[root@youxi1 nginx-1.16.0]# nginx -t  //查看配置文件是否有錯
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@youxi1 nginx-1.16.0]# nginx -V  //查看版本和配置選項信息
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx

  最后使用Windows查看

二、手動升級

  手動升級和半自動化升級大同小異,只是在執行升級語句時,手動輸入打印的命令

(1).解壓文件並編譯

  只編譯不安裝。./configure后面的參數可以保持一致,也可以改動;另外我這里指定了--with-pcre,需要保證后面的參數存在。

[root@youxi1 ~]# tar zxf nginx-1.16.0.tar.gz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/nginx-1.16.0/
[root@youxi1 nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx
[root@youxi1 nginx-1.16.0]# make -j 4  //這里指定的是CPU內核數量,加快編譯速度
[root@youxi1 nginx-1.16.0]# echo $?
0

(2).備份舊的二進制文件,復制新的二進制文件到nginx目錄

[root@youxi1 nginx-1.16.0]# mv /usr/local/nginx/sbin/nginx{,.old}  //備份
[root@youxi1 nginx-1.16.0]# ls /usr/local/nginx/sbin/
nginx.old
[root@youxi1 nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/  //復制
[root@youxi1 nginx-1.16.0]# ls /usr/local/nginx/sbin/
nginx nginx.old

(3).執行取代make upgrade的命令

  注意:這里的nginx.pid(nginx進程文件)所在地址不是固定的,需要查看nginx目錄下的conf/nginx.conf配置文件

[root@youxi1 nginx-1.16.0]# /usr/local/nginx/sbin/nginx -t  //查看配置文件是否正確,這里使用的是剛復制過來的nginx二進制文件
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@youxi1 nginx-1.16.0]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`    //發送平滑遷移信號給舊的nginx
[root@youxi1 nginx-1.16.0]# test -f /usr/local/nginx/logs/nginx.pid.oldbin  //我們判斷是否平滑遷移到nginx.pid.oldbin,test -f與echo $?的組合
[root@youxi1 nginx-1.16.0]# echo $?
0
[root@youxi1 nginx-1.16.0]# ls /usr/local/nginx/logs/nginx.pid*  //判斷是否平滑遷移也可以ls命令查看是否存在nginx.pid.oldbin文件
/usr/local/nginx/logs/nginx.pid /usr/local/nginx/logs/nginx.pid.oldbin
[root@youxi1 nginx-1.16.0]# kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`  //從容關閉nginx進程
[root@youxi1 nginx-1.16.0]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`  //不重啟舊的nginx進程
[root@youxi1 nginx-1.16.0]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`  //結束工作進程,完成此次升級

  test -f [文件]和echo $?組合判斷平滑遷移,與直接ls [文件]判斷平滑遷移只要使用一個就可以了。

(4).檢測是否升級成功

  首先看看是否正在運行

[root@youxi1 nginx-1.16.0]# ps aux | grep nginx
nginx      1307  0.0  0.1 216972  6244 ?        S    10:34   0:00 php-fpm: pool www
nginx      1308  0.0  0.1 216972  6244 ?        S    10:34   0:00 php-fpm: pool www
root       7476  0.0  0.0  18252  1728 ?        S    10:45   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      7477  0.0  0.0  18624  1360 ?        S    10:45   0:00 nginx: worker process
nginx      7493  0.0  0.0  18600  1344 ?        S    10:47   0:00 nginx: worker process
root       7571  0.0  0.0 112724   988 pts/0    S+   11:08   0:00 grep --color=auto nginx

  接着看看配置文件是否有錯,還有nginx的版本和配置選項信息。我能直接使用nginx是因為配置了環境變量。

[root@youxi1 nginx-1.16.0]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) 
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module
 --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.41 --user=nginx --group=nginx

  最后使用Windows查看

 

參考:https://blog.csdn.net/xiaolong20081/article/details/82871878

   https://www.cnblogs.com/happlyp/p/6090409.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM