一、Nginx 平滑升级
- 当我们使用的Nginx版本存在BUG,亦或希望使用更高级的功能时。就有可能需要对我们目前使用的Nginx版本进行升级。那如何升级呢? 我们这里分为理想情况的升级,和实际工作中的升级去分析。
1、理想情况的升级
- 有可能你真的没有什么运维经验,将实际情况想象的过于复杂。网上看到的一切有关平滑升级的情况没有问题,但基本上都是针对单点Nginx去做的升级。而实际运维工作中,我们不可能让单点Nginx服务存在。如果逼不得已真的存在,请按照下面的升级方案升级吧。
- nginx指令及信号关系
reopen 对应USR1信号
reload 对应HUP信号
stop 对应TERM信号或者INT信号
quit 对应QUIT信号
TERM或者INT:表示立即停止nginx
QUIT: 表示优雅的停止nginx
HUP: 重载配置文件
USR1: 重新打开日志文件
USR2: 热升级nginx程序
WINCH: 优雅的关闭相应的worker进程
1、具体升级步骤(用户无感知) 1.16 -> 1.18
# 检查当前Nginx 版本
[root@localhost ~]# /usr/local/nginx/sbin/nginx -V
# 确保当前版本的nginx 是存活的
[root@localhost ~]# ps -ef |grep nginx
# 编译安装高版本Nginx
[root@localhost ~]# wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@localhost ~]# tar xf nginx-1.18.0.tar.gz
[root@localhost ~]# cd nginx-1.18.0
[root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-pcre \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_image_filter_module \
--with-http_slice_module \
--with-mail \
--with-threads \
--with-file-aio \
--with-stream \
--with-mail_ssl_module \
--with-stream_ssl_module \
--with-http_geoip_module \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module
# 注意第三方模块需要下载
# 下载链接 http://wiki.nginx.org/3rdPartyModules
[root@localhost nginx-1.18.0]# make
# 备份旧的nginx,一方面是等一下需要把新的nginx复制过来,另一方面的如果新的nginx有问题还可以进行恢复
[root@localhost nginx-1.18.0]# mkdir /usr/local/nginx/sbin/nginx{,.bak}
#把编译好的新的nginx文件服务到指定的安装目录中
[root@localhost nginx-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/
# 检查高版本Nginx 对原有配置文件是否兼容
[root@localhost sbin]# /usr/local/nginx/sbin/nginx -t
#使用新版本的Nginx文件启动服务,之后平缓停止原有Nginx进程
[root@localhost nginx-1.18.0]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# 可以看到这里自动把之前的nginx.pid命名为nginx.pid.oldbin,并为新的nginx生成nginx.pid
[root@localhost nginx-1.18.0]# cd /nginx/logs/
nginx.pid nginx.pid.oldbin
#平缓停止旧服务的worker process
[root@localhost logs]# kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
#平缓停止旧服务的master process
[root@localhost logs]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# 检查是否升级成功
[root@localhost logs]# /usr/local/nginx/sbin/nginx -V
# 检查Nginx 进程是否存在
[root@localhost logs]# ps -aux |grep nginx
2、实际工作中的升级
- 在实际工作中,Nginx服务不可能单点部署。我们往往面临的是一个Nginx服务集群。再按照理想的情况进行升级,就有些得不偿失了。 那如何操作才能保证整个Nginx服务集群都升级OK呢?
- 可想而知,服务器集群的前端必有反向代理,反向代理对整个服务器集群是有健康检查的。如果健康检查发现了某台服务器已经DOWN机,就会将机器从反向代理中摘除。这样就不会有生产环境的流量引入。当健康检查检测到服务器UP后,会再将这台服务器添加到反向代理上,这之后生产流量才会引入。
- 因此在实际工作场景中,我们只需要关闭Nginx服务、升级Nginx软件包、启动Nginx服务即可。
3、具体升级步骤
- 关闭 Nginx 服务 /usr/local/nginx/sbin/nginx -s stop 或者 kill QUIT PID
- 升级 Nginx 二进制文件
- 启动 Nginx 服务 /usr/local/nginx/sbin/nginx
- 注意,请将Nginx 的路径替换成真实的路径