Firefox 定期不会通过 HTTP2 使用 SSL 从 nginx 服务器下载 CSS 文件

Firefox 定期不会通过 HTTP2 使用 SSL 从 nginx 服务器下载 CSS 文件

当我使用 Firefox 访问包含大量 CSS 文件的网站时,有时并非所有 CSS 文件都会被下载

查看 Firefox(F12)中的开发人员控制面板,我发现,当问题发生时,文件的状态为 0,几乎就像请求从未发送到服务器一样,但查看服务器时请求就在那里。

我尝试尽可能简化问题,并将其简化为一个包含 100 个 CSS 文件的 html 文件,以及一些会自动检测问题发生时间的 javascript

这是为了让人们更容易地在自己的装置上进行测试,并试图证明我并不是疯了

测试参数:

GCP 上的全新 Debian 9(也在 CentOS 上测试过)

nginx 1.10.3(但它也发生在最新的稳定版和主线上)

已启用 HTTPS/SSL(使用自签名、Let's encrypt 和商业 SSL 进行测试)

已启用 HTTP2

Firefox 66(也使用 Firefox 65 进行了测试)

现在,当我访问我的测试 HTML 时,javascript 将重新加载页面,直到发生错误,然后显示警报。这可能需要几秒钟到五分钟的时间,通常发生在第一分钟内

Firefox 将下载前几个 CSS 文件,然后似乎跳过其余文件,或者跳过 20-30-40 个文件,然后重试,跳过的文件的状态为 0。nginx 访问日志将显示其响应状态为 200 或 304,但 Firefox 永远不会显示该信息

html/css 测试包可以在这里下载: html 测试包

我不能 100% 确定这是谁或什么的错

很可能是我,但如果是这样的话,应该没有人能够重现我的结果,而且已经有几个人

它可能是 Firefox,也可能是 nginx,或者两者的组合

任何帮助都将不胜感激,过去两天我一直在苦苦挣扎

编辑/澄清:

我意识到我永远不应该“强迫”用户在生产服务器上下载 100 个 CSS 文件:)

100 只是一个数字,结果很容易和快速重现,所以我用 100 作为测试包,以便你们可以更轻松/更快地重现问题

答案1

由于没有答案,而且有点偏离主题(我希望 Michael Hampton 没有恶意 :)),我最终向 Firefox 团队提交了一个错误: https://bugzilla.mozilla.org/show_bug.cgi?id=1538978

该错误被证明是其他一些错误的重复,所有这些都可以在 bugzilla 上看到。

但简而言之,当 nginx 达到其 http2_max_requests 限制时,它会发送“goaway”。

Firefox 无法很好地处理这个问题,因此产生了一些问题

Chrome 处理得更好一些,它似乎等待一会儿然后重试

我不知道谁是“错”,但显著减少问题的一种方法是将 http2_max_requests 设置为一个非常高的数字,比如 500.000,默认值是 1000

http2_max_requests 500000;

我已经这样运行了几个星期,没有任何问题。所以……问题“解决了”

相关内容