如果我们需要对当前的Nginx服务进行升级 ,应用新的模块,最简单的方式是停下来,然后开启新的Nginx服务,那么给我们的用户体验是非常差的,会导致用户在一段时间内无法访问我们的服务器为了解决这个问题,Nginx提供了平滑升级的方案。
为了实现nginx服务器的平滑升级,新安装的服务器路径应该和旧的一致。因此建议用新安装的服务器之前先备份一下我们的旧nginx服务器,如果由于种种原因不能保持新旧客户端路径一致则可以做一下操作,将旧的服务器路径更改为新的路径,新的服务器放入旧的路径中 过程如下:
一般有两种情况下需要升级Nginx,一种是确实要升级Nginx的版本,另一种是要为Nginx添加新的模块。,Nginx方便地帮助我们实现了平滑升级。其原理简单概括:
- 在不停掉老进程的情况下,启动新进程。
- 老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
- 新进程接受新请求。
- 老进程处理完所有请求,关闭所有连接后,停止。
一、主要过程如下
需求:现在我们 需要将原有的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
8. 查看nginx 进程状态,此时或多出一个nginx进程(一个master和worker)
ps aux | grep nginx
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. 查看安装后的版本
11. 查看安装时候的参数(切换到安装目录 /sibn , 执行./nginx -V)