开启 HTTP/2 导致老设备访问故障?一文搞定兼容性配置

来源:互联网 时间:2026-10-30

打开http2之后,大部分人是好的,报障的集中在两类设备。一类是安卓四点几的老机器,一类是公司的旧笔记本。浏览器地址栏打转十几秒,最后显示连接被重置。nginx的access日志里,这些请求一条都没有记录。同一时间,别人的页面秒开,说明服务端整体是活的。问题只在部分客户端上。

日志里没有记录,说明请求还没进到HTTP这一层。断在TLS握手,不是断在页面。这一步的判断很关键,方向错了会去翻PHP日志,翻一晚也翻不到。

HTTP/2在浏览器里只跑在TLS之上,靠ALPN协商。协商失败本该自动退回一点一,正常不会打不开。真正出事的是协议版本被切掉。为了过安全扫描,把TLS1.0和1.1关掉,只留1.2以上,这一步很常见。安卓四点儿几自带的浏览器只支持到TLS1.0,连握手都完成不了。报障的人里,有一半用的是这类机器。这类浏览器的内核停在很久以前,ALPN是后面才有的东西。

另一类是中间有设备。老防火墙、老负载均衡、某些企业代理不认识ALPN,把带h2的握手直接掐掉。这种情况只影响走那条线路的人。

验证用openssl s_client就够,参数带-alpn h2和-connect,目标写域名加443端口,看输出里的ALPN protocol那一行。返回h2说明服务端没问题,返回空或者http/1.1,说明这条链路把h2丢了。换一台网络不同的机器再跑一次,能区分是服务端还是中间设备。再配合浏览器的开发者工具看,Network面板里Protocol那一列写h2还是http/1.1,一眼就看出来。这一步不用装任何插件。

你要做的是别把回退的路堵死。TLS1.2保留,1.0和1.1关掉,这个取舍是对的,代价是老设备用不了https。如果那部分流量还有价值,就在前面挂一层CDN,让它去兼容老协议。源站只跟CDN握手,握手用的协议是新版本。另外http2的server push已经废弃,配了也不生效,别在这上面花时间。

还有一个细节,nginx的一点二五版本之后,http2从listen参数里独立出来了。老写法listen 443 ssl http2会报警告,新写法是listen 443 ssl加一行http2 on。两种写法在过渡期都能跑,但升级之后不改,某些发行版的包里会直接报错起不来。改之前先nginx -t,改完再reload,别直接重启。站点现在TLS1.2打底,http2开着,前面一层CDN兜住老设备,报障量下来了。保留1.1会让扫描报告多一条,这个取舍自己权衡。真要在两者之间选,优先保住能打开的页面,扫描报告的下限可以跟甲方解释清楚。

相关文章

标签:

A5创业网 版权所有

返回顶部