Chrome HTTP2 请求无法完成大型 gzip 文件(Apache)

Chrome HTTP2 请求无法完成大型 gzip 文件(Apache)

我最近在 Ubuntu 16.04 上将 Aapche 升级到 2.4.26 (ondrej ppa)。默认情况下,模块deflatehttp2已启用。

在 Chrome 上,当提供大型 JS 文件时,请求根本无法完成,并在net::ERR_CONNECTION_CLOSED经过很长时间后失败(本质上是 ApacheTimeout设置指定的时间)。在 Firefox 上,一切都运行正常。

我尝试过

我在故障排除过程中观察到:

  • 小型 JS 文件工作正常。我的大型 JS 文件为 259.43KB(gzip 压缩后为 75.78KB)

  • 如果我在 Apache 中禁用 HTTP2:Protocols http/1.1,Chrome 就可以正常工作。

  • 如果我手动禁用 gzip 模块:a2dismod deflate,Chrome 就可以正常工作。

当然,从性能上来说,这两种选择都不是理想的。

KeepAlive就像在黑暗中射击一样,我尝试按照此问题的答案所建议的方式关闭:https://stackoverflow.com/questions/25847083/chrome-just-doesnt-finish-loading-js-files。这并不能解决问题。

我从 Chrome 开发者工具中复制了有问题的 JS 文件的 HTTP 标头:

HTTP 请求标头

:authority: example.com
:method:GET
:path:/js/main.js
:scheme:https
accept:*/*
accept-encoding:gzip, deflate, br
accept-language:en-US,en;q=0.8
cache-control:no-cache
pragma:no-cache
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

HTTP 响应标头

accept-ranges:bytes
cache-control:max-age=7200
content-encoding:gzip
content-type:application/javascript; charset=utf-8
date:Mon, 03 Jul 2017 07:23:27 GMT
last-modified:Thu, 01 Jun 2017 14:49:09 GMT
server:Apache
status:200
vary:Accept-Encoding
x-content-type-options:nosniff

我读了一些书,可以与缺少响应标头的分块 gzip 响应有关Content-Length。也可能是由于缺少Transfer-Encoding响应标头。但我不确定正确的做法是什么,或者如何让 Apache 输出这些标头。

问题

问题出在哪里?如何在 Apache Web 服务器上使用 gzip 启用 HTTP2?

如果它是由分块 gzip 压缩的 HTTP2 响应的错误/丢失的标头引起的,有人可以阐明需要哪些标头吗?即,提供分块 gzip HTTP2 响应的正确方法是什么?

答案1

这是 Apache 中的一个已知错误,我目前正在处理。请参阅https://github.com/icing/mod_h2/issues/143

相关内容