Linux - Nginx 平滑升級

當公司中無前面的調度器時,須要在不中斷用戶連接的狀況下,進行平滑升級,可採用以下方法nginx

# 備份當前nginx二進制文件,注意本身安裝路徑,個人是本身編譯安裝本身指定路徑
[21:12:22 root@centos8 sbin]#ll /apps/nginx/sbin/
total 14964
-rwxr-xr-x 1 root root 7595800 Jul 11 21:02 nginx
-rwxr-xr-x 1 root root 7595800 Jul 11 21:14 nginx.bk


#若是是yum安裝
[21:40:02 root@centos8 ~]#ll /usr/sbin/nginx
-rwxr-xr-x 1 root root 1264168 Oct  8  2019 /usr/sbin/nginx

# 下載你須要更新的版本,請注意偶數版本號爲穩定版本,奇數版爲測試環境版本算法

# 我是從1.18.0 升級到1.20.0centos

[21:43:40 root@centos8 sbin]#wget http://nginx.org/download/nginx-1.20.0.tar.gz

# 解壓縮,編譯,make, 不須要make install數組

tar xf nginx-1.20.0.tar.gz -C /usr/local/src
cd /usr/local/src/nginx-1.20.0/

# 編譯選項與舊版本的編譯選項要一直,能夠先用nginx -V 查看編譯選項
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module


# 不作make install
make


#上述完成之後,會在當前我解壓縮nginx的objs下面產生一個nginx二進制文件
[21:44:32 root@centos8 sbin]#cd /usr/local/src/nginx-1.20.0/objs/
[21:48:05 root@centos8 objs]#ll
total 7708
-rw-r--r-- 1 root root   18498 Jul 11 21:21 autoconf.err
-rw-r--r-- 1 root root   53134 Jul 11 21:21 Makefile
-rwxr-xr-x 1 root root 7724128 Jul 11 21:21 nginx
-rw-r--r-- 1 root root    5517 Jul 11 21:21 nginx.8
-rw-r--r-- 1 root root    7914 Jul 11 21:21 ngx_auto_config.h
-rw-r--r-- 1 root root     657 Jul 11 21:21 ngx_auto_headers.h
-rw-r--r-- 1 root root    8868 Jul 11 21:21 ngx_modules.c
-rw-r--r-- 1 root root   60184 Jul 11 21:21 ngx_modules.o
drwxr-xr-x 9 root root      91 Jul 11 21:21 src

# 複製新版本的nginx二進制文件到就二進制文件路徑,覆蓋它,若是cp不行可用mv覆蓋
mv nginx /apps/nginx/sbin/nginx

# 此時就可查詢nginx的版本
[21:50:02 root@centos8 ~]#nginx -V
nginx version: nginx/1.20.0
built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC) 
built with OpenSSL 1.1.1g FIPS  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module

#可是依然是舊版本nginx在作服務,用USR2信號把新的nginx做爲舊nginx
的子進程
kill -USR2 `cat /apps/nginx/logs/nginx.pid`
[21:26:03 root@centos8 ~]#ps auxf | grep nginx
root       14058  0.0  0.0  12132  1064 pts/0    S+   21:28   0:00  |           \_ grep --color=auto nginx
root        6727  0.0  0.1  42440  2672 ?        Ss   21:12   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx       6728  0.0  0.2  77096  5052 ?        S    21:12   0:00  \_ nginx: worker process
root       14055  0.0  0.3  42468  6112 ?        S    21:28   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      14056  0.0  0.2  77212  4668 ?        S    21:28   0:00      \_ nginx: worker process

# 此時pid文件會產生一個pid.oldbin,這個文件是舊nginx的進程號,新的pid文件時新的master nginx進程號
[21:29:47 root@centos8 ~]#ll /apps/nginx/logs/
total 16
-rw-r--r-- 1 root root 437 Jul 11 21:13 access.log
-rw-r--r-- 1 root root 312 Jul 11 21:28 error.log
-rw-r--r-- 1 root root   6 Jul 11 21:28 nginx.pid
-rw-r--r-- 1 root root   5 Jul 11 21:12 nginx.pid.oldbin

# 用信號WINCH優雅的關閉舊master的worker進程
kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`

[21:30:24 root@centos8 ~]#ps auxf | grep nginx
root       14058  0.0  0.0  12132  1064 pts/0    S+   21:28   0:00  |           \_ grep --color=auto nginx
root        6727  0.0  0.1  42440  2672 ?        Ss   21:12   0:00 nginx: master process /apps/nginx/sbin/nginx
nginx       6728  0.0  0.2  77096  5052 ?        S    21:12   0:00  \_ nginx: worker process   -> 這個worker進程會被刪除
root       14055  0.0  0.3  42468  6112 ?        S    21:28   0:00  \_ nginx: master process /apps/nginx/sbin/nginx
nginx      14056  0.0  0.2  77212  4668 ?        S    21:28   0:00      \_ nginx: worker process

# 注意接下來比較重要,由於若是想要回滾舊版本,此時就是回滾時刻 # 發送HUB信號給舊版本 kill -HUB 舊master進程號 kill -quit 新master進程號 ### 此時回滾成功 #固然還有其餘回滾方法,這次不作介紹 # 當確認無問題之後,發送quit關閉老版本 kill -quit 舊master進程號

 

# Nginx的I/O特性,阻塞,非阻塞,多路複用,信號驅動,異步app

其中多路複用中涉及三個系統調用,SELECT,POLL,EPOLL, 異步

SELECT: 連接只有1024,用數組存放,而後採用遍歷算法,其時間複雜度爲O(n)ide

POLL:連接無上限,用鏈表存放,而後採用遍歷算法,其時間複雜度爲O(n)測試

EPOLL:最優,連接無上限,用hash表存放,採用紅黑樹算法,完成會用事件通知的形式,其時間複雜度爲O(1)ui

相關文章
相關標籤/搜索