Nginx平滑升级


一、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 的路径替换成真实的路径