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
方便后续重新编译。