如果我们需要对当前的Nginx服务进行升级 ,应用新的模块,最简单的方式是停下来,然后开启新的Nginx服务,那么给我们的用户体验是非常差的,会导致用户在一段时间内无法访问我们的服务器为了解决这个问题,Nginx提供了平滑升级的方案。

      为了实现nginx服务器的平滑升级,新安装的服务器路径应该和旧的一致。因此建议用新安装的服务器之前先备份一下我们的旧nginx服务器,如果由于种种原因不能保持新旧客户端路径一致则可以做一下操作,将旧的服务器路径更改为新的路径,新的服务器放入旧的路径中 过程如下:

     一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Nginx添加新的模块。,Nginx方便地帮助我们实现了平滑升级。其原理简单概括:

  1. 在不停掉老进程的情况下,启动新进程。
  2. 老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
  3. 新进程接受新请求。
  4. 老进程处理完所有请求,关闭所有连接后,停止。

一、主要过程如下



      需求:现在我们 需要将原有的nginx版本1.8.0 进行升级为官方推荐稳定版本1.18.0, 并在不影响业务的情况下添加SSL和pcre模块。



1. 下载官方的最新稳定版本

wget https://nginx.org/download/nginx-1.18.0.tar.gz



2. 解压安装包

tar zxvf nginx-1.18.0.tar.gz



3. 切换到1.18 解压目录下执行 ./configure命令(保持原nginx 的 --prefix 安装路径)

cd /download/nginx-1.18.0

 ./configure --prefix=/usr/local/nginx/nginx-1.8.0 --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre



4.执行make ,执行完成后不需要执行 make install

make



5. 把原有的nginx二进制文件改名 nginx.old

mv /usr/local/nginx/nginx-1.8.0/sbin/nginx /usr/local/nginx/nginx-1.8.0/sbin/nginx_old



6. 拷贝新编译好的nginx文件到sbin目录

cp /download/nginx-1.18.0/objs/nginx  /usr/local/nginx/nginx-1.8.0/sbin



7. 使用USR2信号量,启动一个新的nginx进程。新旧Nginx进程会一起工作;

kill -USR2 `cat /usr/local/nginx/nginx-1.8.0/logs/nginx.pid`


      注释:Nginx服务接受到USR2的信号后,首先将旧的Nginx。pid文件后面添加一个.oldbin变成了nginx.pid.oldbin 然后执行新版本的Nginx服务器的二进制文件启动服务,如果启动成功那么我们将会有两个Nginx服务在提供服务。如果新的Nginx服务配置文件有问题那么将显示错误然后任然使用旧的Nginx



linux平滑升级nginx sudo nginx的平滑升级_linux




8. 查看nginx 进程状态,此时或多出一个nginx进程(一个master和worker)

ps aux | grep nginx

linux平滑升级nginx sudo nginx的平滑升级_nginx_02




9. 使用 WINCH 信号量,平滑停止旧的master对应的worker进程,这个时候由新的Nginx处理服务请求

kill -WINCH `cat /usr/local/nginx/nginx-1.8.0/logs/nginx.pid.oldbin`

此时可以有2个操作:

  • 选择启用新的Nginx 进程 (可以理解为commit),使用 QUIT 信号量 平缓结束 旧的的pid
kill -QUIT `cat /usr/local/nginx/nginx-1.8.0/logs/nginx.pid.oldbin`
  • 或者启用旧的Nginx进程(可以理解为rallback),使用 HUP 信号量 平缓重启 使用 旧的pid
// 执行  HUP,恢复原来的旧的Nginx 进程
kill -HUP `cat /usr/local/nginx/nginx-1.8.0/logs/nginx.pid.oldbin` 

//在执行QUIT ,结束新的Nginx 进程
kill -QUIT `cat /usr/local/nginx/nginx-1.8.0/logs/nginx.pid`

注释:Nginx 启动停止可以参考:


10. 查看安装后的版本

linux平滑升级nginx sudo nginx的平滑升级_服务器_03




11. 查看安装时候的参数(切换到安装目录 /sibn , 执行./nginx -V)

linux平滑升级nginx sudo nginx的平滑升级_Nginx_04