您现在的位置是:首页 >其他 >Nginx平滑升级版本或添加模块网站首页其他
Nginx平滑升级版本或添加模块
简介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
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。