把服务器从低版本升级到高版本,强行停止服务器,会影响正在运行的进程,对用户的体验页非常差。所以需要平滑升级。什么是平滑升级呢?平滑升级就是在不停掉正在运行的进程,不会停止服务。在平滑升级的过程中,新开的进程也会被处理。
在现实情况下,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 objs3.备份原有版本的nginx
进入原有版本的nginx,例如ubuntu中(apt安装) 二进制文件 /usr/sbin/nginx1
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.放弃升级]。
- 关闭旧版本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 存放日志