检查当前版本
nginx 不在系统 PATH 中,需要指定完整路径执行
# 您的 nginx 在 /usr/local/nginx/sbin/ 目录下
# 需要用完整路径执行
/usr/local/nginx/sbin/nginx -v修复步骤
第一步:确认当前版本
# 查看当前 NGINX 版本
/usr/local/nginx/sbin/nginx -v
# 同时查看编译参数(升级时需要)
/usr/local/nginx/sbin/nginx -V第二步:升级到安全版本
a 备份配置文件和二进制
cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old.$(date +%Y%m%d)确认当前进程PID(后续热升级用)
cat /usr/local/nginx/logs/nginx.pidb 下载并编译新版本
cd /usr/local/src
# 下载 NGINX 1.30.1
wget https://nginx.org/download/nginx-1.30.1.tar.gz
tar -zxvf nginx-1.30.1.tar.gz
cd nginx-1.30.1
# 使用与原版本完全相同的编译参数
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-openssl=/tmp/nginx/openssl-1.1.1d
# 编译(不要 make install!)
make -j$(nproc)c 热升级(不中断服务)
# 1. 替换二进制文件
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp ./objs/nginx /usr/local/nginx/sbin/nginx
# 2. 验证新版本
/usr/local/nginx/sbin/nginx -v
# 应该显示 nginx/1.30.1
# 3. 测试配置文件
/usr/local/nginx/sbin/nginx -t
# 4. 热升级:发送 USR2 启动新主进程
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
# 5. 等待几秒,确认新进程启动
ps aux | grep nginx
# 应该看到新旧两组 worker 进程
# 6. 优雅关闭旧进程
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)d 验证升级成功
# 确认版本
/usr/local/nginx/sbin/nginx -v
# 输出应为: nginx/1.30.1
# 确认服务正常
curl -I http://localhost/
# 或访问您的网站测试
# 查看进程
ps aux | grep nginxe 检查漏洞配置
grep -rnE 'rewrite\s+.*\?.*\$[0-9]' /usr/local/nginx/conf/[root@iZon201ihvpnoi2e3ftkphZ nginx-1.30.1]# make -j$(nproc)
make -f objs/Makefile
make[1]: Entering directory '/usr/local/src/nginx-1.30.1'
cd /tmp/nginx/openssl-1.1.1d \
&& if [ -f Makefile ]; then make clean; fi \
&& ./config --prefix=/tmp/nginx/openssl-1.1.1d/.openssl no-shared no-threads \
&& make \
&& make install_sw LIBDIR=lib
/bin/sh: line 0: cd: /tmp/nginx/openssl-1.1.1d: No such file or directory
make[1]: *** [objs/Makefile:1260: /tmp/nginx/openssl-1.1.1d/.openssl/include/openssl/ssl.h] Error 1
make[1]: Leaving directory '/usr/local/src/nginx-1.30.1'
make: *** [Makefile:10: build] Error 2
[root@iZon201ihvpnoi2e3ftkphZ nginx-1.30.1]#重新下载 OpenSSL 1.1.1d
# 创建目录并下载
mkdir -p /tmp/nginx
cd /tmp/nginx
wget https://www.openssl.org/source/openssl-1.1.1d.tar.gz
tar -zxf openssl-1.1.1d.tar.gz
# 回到 nginx 源码目录重新编译
cd /usr/local/src/nginx-1.30.1
# 清理之前的编译
make clean
# 重新配置(使用原来的参数)
./configure \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-openssl=/tmp/nginx/openssl-1.1.1d
# 编译
make -j$(nproc){/collapse-item}
{collapse-item label="编译完成,备份和覆盖"}
# 1. 替换二进制(解决 Text file busy)
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old.running
rm -f /usr/local/nginx/sbin/nginx
cp ./objs/nginx /usr/local/nginx/sbin/nginx
# 2. 验证版本
/usr/local/nginx/sbin/nginx -v
# 应该显示 nginx/1.30.1
# 3. 测试配置
/usr/local/nginx/sbin/nginx -t
# 4. 热升级
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
sleep 5
# 5. 查看新旧进程
ps aux | grep "nginx:"
# 6. 关闭旧进程
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)
# 7. 最终验证
/usr/local/nginx/sbin/nginx -v
ps aux | grep nginx

{/collapse-item}
{collapse-item label="如果热升级后有问题,回滚"}
# 停止当前 nginx
kill $(cat /usr/local/nginx/logs/nginx.pid)
# 恢复旧版本
cp /usr/local/nginx/sbin/nginx.old.running /usr/local/nginx/sbin/nginx
# 启动旧版本
/usr/local/nginx/sbin/nginx检查漏洞配置
# 搜索可能存在漏洞的 rewrite 配置
grep -rnE 'rewrite\s+.*\?.*\$[0-9]' /usr/local/nginx/conf/清理源码
删除旧版本备份(确认一切正常后)
rm -f /usr/local/nginx/sbin/nginx.old
rm -f /usr/local/nginx/sbin/nginx.old.running
删除编译源码(可选)
rm -rf /usr/local/src/nginx-1.30.1
rm -rf /usr/local/src/nginx-1.30.1.tar.gz
最终确认版本确认
/usr/local/nginx/sbin/nginx -v
输出: nginx/1.30.1
进程确认
ps aux | grep "nginx: master"
应该只有 1 个 master 进程(PID 2890107)
{/collapse-item}
{collapse-item label="折叠标题二"}
折叠内容二
{/collapse-item}
评论 (0)