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