Nginx 源码升级文档(保留原编译参数)- 漏洞CVE-2026-42945修复

当前环境

当前 nginx 编译信息:

nginx version: nginx/1.30.0
built by gcc 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1)
built with OpenSSL 3.6.2 7 Apr 2026
TLS SNI support enabled

当前 configure 参数:

--prefix=/usr/local/nginx
--with-compat
--with-debug
--with-pcre-jit
--with-http_ssl_module
--with-http_stub_status_module
--with-http_realip_module
--with-http_auth_request_module
--with-http_v2_module
--with-http_v3_module
--with-http_dav_module
--with-http_slice_module
--with-threads
--with-http_addition_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_sub_module
--with-file-aio
--with-openssl=/usr/local/src/openssl-3.6.2
--add-dynamic-module=/usr/local/src/ngx_http_geoip2_module-3.4

1. 下载新版本 nginx

建议升级到 stable 版本。

cd /usr/local/src
wget https://nginx.org/download/nginx-1.30.1.tar.gz
tar xf nginx-1.30.1.tar.gz
cd nginx-1.30.1

2. 重新 configure

使用原有参数重新编译:

./configure \
  --prefix=/usr/local/nginx \
  --with-compat \
  --with-debug \
  --with-pcre-jit \
  --with-http_ssl_module \
  --with-http_stub_status_module \
  --with-http_realip_module \
  --with-http_auth_request_module \
  --with-http_v2_module \
  --with-http_v3_module \
  --with-http_dav_module \
  --with-http_slice_module \
  --with-threads \
  --with-http_addition_module \
  --with-http_gunzip_module \
  --with-http_gzip_static_module \
  --with-http_sub_module \
  --with-file-aio \
  --with-openssl=/usr/local/src/openssl-3.6.2 \
  --add-dynamic-module=/usr/local/src/ngx_http_geoip2_module-3.4

3. 编译

make -j"$(nproc)"

4. 备份旧 nginx 二进制

不要直接覆盖,先备份:

cp /usr/local/nginx/sbin/nginx \
   /usr/local/nginx/sbin/nginx.$(date +%F-%H%M%S).bak

5. 替换新二进制

cp objs/nginx /usr/local/nginx/sbin/nginx

6. 测试配置

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

确认输出:

syntax is ok
test is successful

7. 平滑热升级(推荐)

查看当前 master pid

cat /usr/local/nginx/logs/nginx.pid

发送 USR2 信号

启动新 master:

kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)

此时会生成:

nginx.pid.oldbin

关闭旧 worker

kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

验证新 nginx 是否正常

/usr/local/nginx/sbin/nginx -V
ps -ef | grep nginx


完全退出旧 master

确认新版本运行正常后:

kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

8. 回滚方法

如果升级后异常:

恢复旧二进制

cp /usr/local/nginx/sbin/nginx.xxxxx.bak \
   /usr/local/nginx/sbin/nginx

reload

/usr/local/nginx/sbin/nginx -s reload

或者重新热升级。


9. 验证动态模块

确认 geoip2 模块存在:

ls -lh /usr/local/nginx/modules/

检查配置:

load_module modules/ngx_http_geoip2_module.so;

测试:

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

10. 常见问题

1)HTTP/3 编译失败

确认 OpenSSL 版本:

openssl version

建议:

OpenSSL >= 3.5.1

当前:

OpenSSL 3.6.2

兼容 HTTP/3。


2)升级后模块不兼容

如果报:

[emerg] module "/usr/local/nginx/modules/ngx_http_geoip2_module.so" version 1030000 instead of 1030001 in /etc/nginx/n>
vice: Control process exited, code=exited, status=1/FAILURE

说明:

  • nginx 版本变化较大
  • 模块未重新编译
  • configure 参数不一致

解决:

重新完整编译动态模块。

因动态编译的,可以把objs下生成的ngx_http_geoip2_module.so拷贝到/usr/local/nginx/modules/


3)查看实际运行版本

/usr/local/nginx/sbin/nginx -V

11. 推荐升级后的检查

curl -I http://127.0.0.1

curl -k --http3 https://your-domain.com

ss -lntp | grep nginx

journalctl -u nginx -n 100

12. 推荐保留目录

/usr/local/src/nginx-1.30.1
/usr/local/src/openssl-3.6.2
/usr/local/src/ngx_http_geoip2_module-3.4

方便后续重新编译。