当公司中无前面的调度器时,需要在不中断用户链接的情况下,进行平滑升级,可采用如下方法

# 备份当前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)