Upgrade 踩坑记录

Upgrade 踩坑记录

今天接到客户的工单:同一个网址 Safari 打不开,Chrome 却能秒开。这工单居然幸运地落在了我的案头。一接到这活儿,我脑子里就已经开始放电影了,接下来几天,怕是要一头扎进排查的海洋里,跟这诡异的问题较上劲儿了。

复现与排查

由于没有苹果的设备,所以无法截取到 safari 获取失败的图片,下面的截图是客户提供的(没提供开发调试工具的信息)

通过 curl 测试,看看能不能找到复现,找到更加具体的报错。
我本地测居然是正常的,怎么会这个样子 !!! 好在后面同事问了我一下。
对比两张截图发现使用的 http 版本不一致。这就很奇怪了,为啥一样的请求但是 http 版本还不一样呢? 查了一下资料,发现原因也是比较简单: Ubuntu 16.04 自带的 curl 是不支持 http/2 请求的,用的系统有点老了,有点懒得换系统,配环境好麻烦,直接装个新版本的 curl 吧!!!
所以经过我们 CDN 的 curl 请求结果就是下面这张图了
接下来把请求直接发送到源站 ,得到 header 响应头。(大致是这样的,这里的截图找不到了,客户源站也改过了
1
2
3
4
5
6
7
8
9
10
11
12
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Thu, 30 Sep 2022 12:18:33 GMT
Date: Thu, 30 Sep 2022 12:18:33 GMT
< Server: Apache
Server: Apache
< Upgrade: h2
Upgrade: h2
< Connection: Upgrade, close
Connection: Upgrade, close
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
观察下来感觉 Upgrade: h2 可能是问题所在 !!! 但是根据下图来看 Upgrade 也是携带的,是可以正常访问的。
这样看下来就是 http/1.1 和 http/2 的差异了. 后面查询了一些资料得知 ” RFC 7540 规定,http2 的连接是不允许再 upgrade 到 h2 的 “ 按照这么排查下来,问题已经很明显了 : 客户源站通过 http/2 通信的时候携带了 upgrade:h2

chrome 访问正常

但是还有一个问题无法解释。按照上面描述来说,应该所有的请求方式都是无法正常访问的呀

这个问题我现在也没有找到具体的原因,下面就是大胆猜测一波: chrome 应该是没有严格遵守 RFC 7540 的限制,对于这个情况进行了兼容,safari 就没有兼容这种情况。

小结一下

这个 工单 通过上述乱七八糟的分析下来,我们的 CDN 不能正常使用也是符合预期的,只是……
● 源站使用 http/1.1 可以正常访问
● chrome 可以正常访问
基于上面两点,客户怀疑是我们的 CDN 的问题也是比较合理的。只是我们的处理也确实没有问题……