已启用HTTP/2的网站为何未使用该协议?NGINX反向代理求助
遇到这种情况别着急,我帮你梳理几个常见的排查方向,一步步来定位问题:
确认Nginx的HTTP/2配置是否正确
首先要明确:Chrome仅支持基于HTTPS的HTTP/2(也就是h2协议),不支持明文的HTTP/2(h2c)。所以你的Nginx监听443端口的配置必须同时包含ssl和http2参数,比如:listen 443 ssl http2;如果你的配置里只写了
listen 80 http2;,那Chrome肯定会用HTTP/1.1,因为明文HTTP/2不被支持。另外,要确保SSL相关配置(证书、密钥路径)都正确,没有语法错误,可以用nginx -t验证配置文件。检查SSL证书的有效性
Chrome对SSL证书的要求很严格,如果证书是自签名、过期、域名不匹配,或者证书链不完整,浏览器会拒绝使用HTTP/2,自动降级到HTTP/1.1。你可以点击Chrome地址栏的锁图标,查看证书详情,确认有没有警告信息。如果是自签名证书,需要手动添加信任,否则Chrome不会启用HTTP/2。排除中间代理/网络环境的干扰
如果你使用了浏览器代理、VPN,或者所在网络里有其他反向代理设备,这些中间节点可能不支持HTTP/2,导致连接被降级。建议你暂时关闭代理和VPN,切换到手机热点这类干净的网络环境测试,看是否能正常使用HTTP/2。用Chrome DevTools和NetLog分析请求
打开Chrome开发者工具(按F12),切换到「Network」标签页,刷新页面后查看每个请求的「Protocol」列,确认是否所有请求都显示h2。如果还是显示HTTP/1.1,可以导出NetLog日志进一步分析:- 打开
chrome://net-export/页面 - 点击「Start logging to disk」,选择保存位置
- 访问你的网站,然后点击「Stop logging」
日志里会记录HTTP/2握手的详细过程,能帮你找到失败的原因(比如ALPN协商失败)。
- 打开
查看Nginx日志确认协议
你可以在Nginx的access.log配置里添加$http2变量,比如日志格式:log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http2"';重新加载Nginx配置后,查看日志里的
$http2字段,如果显示h2,说明Nginx已经收到HTTP/2请求,问题出在Chrome端;如果显示""或者http/1.1,那说明Nginx的配置还是有问题,没有正确启用HTTP/2。确认Chrome版本和相关设置
确保你的Chrome是较新版本(比如近半年内的版本),旧版本可能对HTTP/2的支持有缺陷。另外,检查chrome://flags页面里的「HTTP/2」选项,确保它设置为「Default」或者「Enabled」,不要设为「Disabled」。
内容的提问来源于stack exchange,提问作者Peter de Bruijn

