Skip to content

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 ≠ Restartnginx -s reload 的机制是通知正在运行的进程去重新读取配置文件。

  • 内存未更新:虽然磁盘上的二进制文件已经被替换了,但内存中运行的代码依然是旧版本的。旧代码里根本没有编译进 HTTP/2 模块,自然无法识别新指令,也无法开启新功能。

4. 正确解法 要想让新编译的二进制文件生效,必须让操作系统加载新文件。两种方式:

  • 方案 A(暴力,会有中断)stop 停止服务,再 start 启动。

  • 方案 B(推荐,平滑升级)

    1. 发送信号启动新进程(新旧并存): kill -USR2 <旧Master_PID>

    2. 停止旧进程处理流量: kill -WINCH <旧Master_PID>

    3. 确认没问题后退出旧进程: kill -QUIT <旧Master_PID>

5. 极简总结

  • 改配置 -> 用 reload

  • 改程序(加模块/升级版本) -> 必须 平滑升级重启

本站总访问量 次 本站访客数 人次

1111111111111111111