1. 场景背景
目的:给运行中的 Nginx (1.28.0) 增加
http_v2_module(HTTP/2) 模块。操作:重新编译源码,生成了新的二进制文件,并直接覆盖了旧的
/sbin/nginx文件。
2. 错误操作
习惯性地执行了命令:
bash./nginx -s reload预期:新模块生效,HTTP/2 开启。
实际:HTTP/2 根本没生效(甚至因为配置文件里加了 http2 指令导致报错 unknown directive , 但是-V能看到有http2模块了)。
3. 根本原因(核心知识点)
Reload ≠ Restart:
nginx -s reload的机制是通知正在运行的进程去重新读取配置文件。内存未更新:虽然磁盘上的二进制文件已经被替换了,但内存中运行的代码依然是旧版本的。旧代码里根本没有编译进 HTTP/2 模块,自然无法识别新指令,也无法开启新功能。
4. 正确解法 要想让新编译的二进制文件生效,必须让操作系统加载新文件。两种方式:
方案 A(暴力,会有中断):
stop停止服务,再start启动。方案 B(推荐,平滑升级):
发送信号启动新进程(新旧并存):
kill -USR2 <旧Master_PID>停止旧进程处理流量:
kill -WINCH <旧Master_PID>确认没问题后退出旧进程:
kill -QUIT <旧Master_PID>
5. 极简总结
改配置 -> 用
reload。改程序(加模块/升级版本) -> 必须 平滑升级 或 重启。