tyltr技术窝

把服务器从低版本升级到高版本,强行停止服务器,会影响正在运行的进程,对用户的体验页非常差。所以需要平滑升级。什么是平滑升级呢?平滑升级就是在不停掉正在运行的进程,不会停止服务。在平滑升级的过程中,新开的进程也会被处理。

在现实情况下,nginx在能满足现状的时候,一般不会升级nginx的版本。也就是说,你如果升级了nginx的话,你面临的一些棘手的问题必须能解决掉,不能为了升级而升级。
如果你有nginx的基础,可以跳过第1节 第 2节,直接看第三节即可。

1. nginx的基本命令#

1.1 启动nginx#

nginx -c /path/to/nginx.conf
说明:nginx -c nginx的配置文件

在启动nginx的时候,也可以先检测配置文件,是否正确。检测通过后在进行启动,命令如下:
*nginx -t -c /path/to/nginx.conf *

1.2 关闭nginx#

在关闭nginx的时候,有两种方式:一种是强制关闭,一种是优雅的关闭

  • 强制退出 nginx -s stop 直接关闭nginx,不管是否正在处理请求
  • 优雅的退出 nginx -s quit 等待请求处理完毕,再关闭nginx

1.3 重启nginx#

nginx -s reload

既然是重启,就意味着当前的nginx正在运行状态。如果当前nginx不是运行状态,那么执行重启的命令,会报错。

1
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)

2.信号控制#

2.1 信号类型#

INT     快速关闭信号   
QUIT     优雅的关闭信号    
HUP      从容的重启信号,一般用于修改配置文件后,重启  
USR1   重读日志,一般用于日志切割  
USR2  平滑升级信号  
WINCH  从容关闭旧进程   
具体用法:#

kill -信号类型 nginx的主进程PID

例如#

kill -INT 26234
kill -HUP 3267

3.平滑升级#

上面1,2的简述是为此节提供基础,下面是平滑升级的过程。

  • 1.下载nginx
    官方下载,选取适合的版本,解压

  • 2.编译nginx
    进入nginx解压目录

    1
    2
    3
    4
    5
    ./configure  
    # 不能执行make install
    make
    # 此目录objs下,就是编译出的高版本nginx
    cd objs
  • 3.备份原有版本的nginx
    进入原有版本的nginx,例如ubuntu中(apt安装) 二进制文件 /usr/sbin/nginx

    1
    cp nginx   nginx.old
  • 4.使用高版本nginx覆盖低版本nginx

    1
    cp -rfp  objs/nginx   /usr/sbin
  • 5.执行平滑升级的信号

1
kill -USR2 `cat /run/nginx.pid`   # /run/nginx.pid  pid文件的保存路径,可在配置中查找

说明: kill -USR2 nginx主进程PID

执行完这一句后,新版本的nginx会启动,但老版本的nginx不会被关闭。也就是说此时新旧俩个版本并存,都有自己的worker 和master。并且会创建一个nginx.old.pid文件,记录原版本master的pid,创建一个nginx.pid文件记录新版本的master进程pid。

  • 6关闭旧版本NGINX的worker进程

​ kill -WINCH 旧版本的master的pid

优雅的关闭旧版本的worker会优雅的关闭,请求会全部到新版本的worker进行处理。但是虽然旧版本的worker已经关闭,但是旧进程的监听socket没有停止,也就是说旧版本的master进程依旧在运行。而且此时依旧可以停止升级回滚到就版本的nginx。如果此时放弃升级,见[8.放弃升级]。

    1. 关闭旧版本nginx主进程

​ kill -QUIT 旧版本nginx主进程PID

关闭就旧版本的nginx master进程,升级完成

  • 8.放弃升级

    kill -HUP 旧版本nginx主进程PID

即可在不读取配置文件的前提下,重启旧版本nginx的worker进程。

4.备注#

ubuntu中nginx的目录
/usr/sbin/nginx 二进制主程序
/etc/nginx 存放配置文件
/usr/share/nginx 存放静态文件
/var/log/nginx 存放日志