Nginx平滑升级版本或添加模块

一、Nginx 平滑升级

一般有两种情况下需要升级 nginx,一种是确实要升级 nginx 的版本,另一种是要为 nginx 添加新的模块。

Nginx平滑升级其原理简单概括:

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

信号说明:

信号 nginx内置shell 说明
HUP nginx -s reload 重载配置文件
USR1 nginx -s reopen 重新打开日志文件,配置mv,用做日志切割
USR2 - 热升级nginx程序
WINCH - 优雅的关闭相关的worker进程
QUIT nginx -s squit 优雅的停止nginx
TERM,INT nginx -s stop 立即停止nginx

实践:1.16 升级到 1.18

nginx -v
nginx version: nginx/1.16.1

按照原来的编译参数安装 nginx 的方法进行安装,只需要到 make,千万不要 make install 。如果make install 会将原来的配置文件覆盖

wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz -C /usr/local/src
cd /usr/local/src/nginx-1.18.0

./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
make 

备份替换nginx命令:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_$(date +%F)
cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/

测试新版本:

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -v

查找nginx.pid文件位置

find / -name nginx.pid
/usr/local/nginx/logs/nginx.pid

发送平滑迁移信号 USR2: 启动新的主进程,实现热升级

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

发送WINCH信号给旧版主进程,旧版主进程就开始从容关闭

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

二、升级失败 回滚操作

1、替换原来的 nginx命令

cd /usr/local/nginx/sbin/
mv nginx_2022-03-21 nginx

2、kill -HUP 旧版本的Master进程号

//不重载 配置文件下 启动旧的worker进程

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

3、kill -USR2 新版本的主进程号

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

4、kill -WINCH 新版本的主进程号

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

三、遇到问题

问题:执行完成 “发送平滑迁移信号 USR2” 没有出现新的Master进程信息

查看日志 报错内容为: 大致意思是 找不到 nginx 目录

execve() failed while executing new binary process "nginx" (2: No such file or directory)

原因:Nginx平滑升级是根据环境变量来进行的 ,找不到 nginx目录 是因为上次启动nginx不是 使用完全路径启动的 而环境变量中并没有 nginx这个目录 所以导致 这个问题!

解决:使用正确的启动方法

/usr/local/nginx/sbin/nginx 

猜你喜欢

转载自blog.csdn.net/weixin_45310323/article/details/131173458