nginx -V(大写V)输出的--prefix=、--conf-path=及全部--with-xxx-module参数必须原样复用于新版本./configure,漏项或错拼将导致“unknown directive”启动失败;编译后用objs/nginx -V和-t验证,严禁make install覆盖配置。

关键在于复用旧版 nginx -V 输出的全部 --with-xxx-module 参数,一个都不能少、也不能错拼。
必须用大写 V 查看完整编译参数
运行以下命令获取原始配置信息:
nginx -V
注意是大写 V,不是小写 v。输出中重点提取:
-
--prefix=(安装根路径,如
/usr/local/nginx) -
--conf-path=(配置文件位置,如
/usr/local/nginx/conf/nginx.conf) - 所有以 --with- 开头的模块项,例如:
--with-http_ssl_module--with-http_realip_module--with-stream--with-stream_ssl_module--with-http_stub_status_module--with-threads
漏掉任意一个,新二进制启动时就会报“unknown directive”或“module not found”,直接失败。
新版本 configure 必须严格照搬旧参数
进入新版本源码目录后,执行 ./configure 时,把上面提取的所有参数原样粘贴过去。可追加新模块(如 --add-module=../ngx_http_geoip2_module),但已有模块不能删、不能改名、不能调整顺序。
示例(请按你自己的实际参数替换):
./configure --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --with-threads
确认无误后再执行 make,严禁执行 make install——它会覆盖 conf/、html/ 等目录,导致配置丢失。
验证新二进制是否加载了全部模块
编译完成后,新程序位于 objs/nginx。先做三步检查:
- 运行
objs/nginx -V,确认输出中包含所有旧模块参数 - 运行
objs/nginx -t,确保配置语法通过(路径和模块都对才不会报错) - 临时启动测试:
objs/nginx -c /usr/local/nginx/conf/nginx.conf -p /usr/local/nginx,观察是否能正常加载并监听端口
全部通过,说明模块已正确集成,可以进入平滑升级信号阶段。
升级后快速确认模块是否生效
完成 USR2 → WINCH → QUIT 流程后,用以下方式交叉验证:
-
ps aux | grep nginx:应看到新旧 master 同时存在(升级中)或只剩新 master(升级完成) -
curl -I http://localhost:80或访问/status(若启用了 stub_status) - 检查 SSL 请求能否正常握手、realip 是否能正确识别客户端 IP、stream 代理是否转发成功
只要旧功能没异常,就说明原有模块已完整保留。


















