the "listen ... http2" directive is deprecated, use the "http2" directive instead

the "listen ... http2" directive is deprecated, use the "http2" directive instead

错误提示

[warn] 708259#708259: the "listen ... http2" directive is deprecated, use the "http2" directive instead in /etc/nginx/sites-enabled/turnipjuice.media:5
[warn] 708259#708259: the "listen ... http2" directive is deprecated, use the "http2" directive instead in /etc/nginx/sites-enabled/turnipjuice.media:6

原因

Nginx 1.25.1版本,根据其变更集说明,之前通过“listen … http2”启用HTTP/2的方式现已弃用。

解决

原配置

listen 443 ssl http2;
listen [::]:443 ssl http2;

新配置

listen 443 ssl;
listen [::]:443 ssl;
http2 on;

豆包总结

本文主要围绕 Nginx 配置中 HTTP/2 指令在不同版本 Nginx 下的兼容性问题展开。自 Nginx 1.25.1 版本起,之前通过 “listen … http2” 启用 HTTP/2 的方法已被弃用。若在 1.25.1 及更高版本中使用旧方法,测试 Nginx 配置时会出现警告,如特定配置文件中相关行因含 http2 参数引发警告。新的实现方法允许在同一端口共享 HTTP/2 和 HTTP/0.9 - 1.1 ,需将 “listen 443 ssl http2;” 及 “listen [::]:443 ssl http2;” 修改为 “listen 443 ssl;”“listen [::]:443 ssl;” 以及 “http2 on;” ,修改后警告应会消失。对于 SpinupWP 服务器,目前建议继续使用已弃用的指令,避免使用新的 HTTP/2 指令实现方式,虽会触发 Nginx 警告,但能防止潜在的服务中断问题,例如新指令在旧版本 Nginx 服务器上无法被识别,导致服务器上所有站点瘫痪。SpinupWP 计划更新工具以根据 Nginx 版本自动更改 HTTP/2 指令,但目前尚未完成。

重要亮点

  • 旧 HTTP/2 指令的弃用:从 Nginx 1.25.1 版本开始,以往通过 “listen … http2” 启用 HTTP/2 的方式已过时。若在 1.25.1 及更高版本的 Nginx 中使用此旧方式,在测试 Nginx 配置时会收到警告,像在 “/etc/nginx/sites - enabled/turnipjuice.media” 文件的相关行,因为包含 http2 参数,就会出现警告提示告知应使用新的 “http2” 指令替代。
  • 新 HTTP/2 指令的实现:Nginx 1.25.1 及更高版本对 HTTP/2 的配置实现有了改变,新方法允许在同一端口共享不同 HTTP 协议版本。具体操作是将原本的 “listen 443 ssl http2;” 和 “listen [::]:443 ssl http2;” 修改为 “listen 443 ssl;”“listen [::]:443 ssl;”,并新增 “http2 on;”,如此修改后,之前因使用旧指令产生的警告便会消失。
  • SpinupWP 服务器的处理建议:在 SpinupWP 服务器上,当前建议继续使用已弃用的 HTTP/2 指令,即便这会触发 Nginx 警告。这是因为若使用新的指令实现方式,当站点克隆到运行旧版本 Nginx 的服务器时,服务器无法识别新指令,会导致该服务器上所有站点无法正常运行。虽然这并非理想解决方案,但目前为保持 SpinupWP 服务器间的兼容性,忽略警告使用旧实现方式是最安全的选择,SpinupWP 后续有计划更新工具以自动适配不同 Nginx 版本的 HTTP/2 指令。