升级 nginx 到 1.25.1,nginx -t 报 invalid parameter http2,回滚版本又正常,配置文件一个字没改。乍看像缓存或者权限的锅,追下去往往不是。
listen 443 ssl; http2 on; nginx -t && nginx -s reload
追下去是这么回事:新版本把 http2 从 listen 参数里拆出来,改成独立的 http2 指令,旧的写法被判为非法参数。这是配置语法变更,不是证书问题。
碰到「listen http2 弃用」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,把 listen 443 ssl http2 改成 listen 443 ssl,另起一行写 http2 on;全量搜一遍配置文件,include 的子配置里也可能有旧写法;改完 reload,用 curl 确认返回的协议仍是 HTTP/2。
验收就看一点,nginx -t 通过,curl -I --http2 返回 HTTP/2 200。
