当公司中无前面的调度器时,需要在不中断用户链接的情况下,进行平滑升级,可采用如下方法
# 备份当前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.0
[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特性,阻塞,非阻塞,多路复用,信号驱动,异步
其中多路复用中涉及三个系统调用,SELECT,POLL,EPOLL,
SELECT: 链接只有1024,用数组存放,然后采用遍历算法,其时间复杂度为O(n)
POLL:链接无上限,用链表存放,然后采用遍历算法,其时间复杂度为O(n)
EPOLL:最优,链接无上限,用hash表存放,采用红黑树算法,完成会用事件通知的形式,其时间复杂度为O(1)