1、概述
在没有网络的环境中,无法使用包管理器一键升级。最可靠的方式是:在外网下载好新版本的Nginx源码包及其编译依赖,上传到内网服务器,通过源码编译的方式进行升级。
2、升级
2.1 下载源码
wget https://nginx.org/download/nginx-1.30.4.tar.gz2.2 查看现有编译参数
复制configure arguments后面全部参数
[root@ ~]# nginx -V nginx version: nginx/1.21.4 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 --with-stream --with-stream_ssl_preread_module2.3 解压源码
[root@ nginx]# tar -zxvf nginx-1.30.4.tar.gz [root@ nginx]# cd nginx-1.30.42.4 执行 configure(粘贴你原有全部编译参数)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.35 --with-stream --with-stream_ssl_preread_module2.5 编译,不要 make install
make2.6 替换二进制文件
#备份旧二进制 cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # 停止nginx /usr/local/nginx/sbin/nginx -s stop #复制新生成程序 cp objs/nginx /usr/local/nginx/sbin/ # 启动nginx /usr/local/nginx/sbin/nginxkill方式
停止和热升级区别
停止nginx:kill -TERM $(cat /usr/local/nginx/logs/nginx.pid)
| 指令 | 信号 | 行为结果 | 业务影响 | 使用场景 |
|---|---|---|---|---|
kill -USR2 | SIGUSR2 | 启动新 Nginx 进程组,老进程保留,服务不停止 | 零停机,服务持续运行 | nginx 二进制版本平滑升级 |
kill -TERM | SIGTERM | 等待现有请求处理完,全部进程退出,服务停止 | 服务最终下线 | 优雅关停 Nginx 服务 |
补充容易混淆的 Nginx 常用信号
kill -HUP pid # 平滑重载配置,不重启进程,修改conf后生效 kill -QUIT pid # 优雅退出(和TERM行为接近,nginx官方推荐优雅停止用QUIT) kill -USR1 pid # 重新打开日志文件(日志切割) kill -USR2 pid # 二进制平滑升级 kill -WINCH pid # 让老worker逐步退出(配合USR2升级之后使用)nginx方式
停止
# 停止nginx /usr/local/nginx/sbin/nginx -s stopnginx -s 信号控制命令
语法:nginx -s <signal>,仅给 master 进程发信号,不需要 kill 手动指定 pid
# 完整停止:立刻终止所有worker,断开连接,业务中断 nginx -s stop # 优雅停止:处理完现有连接后再退出,不强行切断现有请求(生产优先用) nginx -s quit # 重载配置:平滑加载nginx.conf,不中断业务,热更新配置 nginx -s reload # 重新打开日志文件,日志切割后执行,用于logrotate切割日志 nginx -s reopen2.7 校验版本
nginx -v nginx -t