已启用 http2 但仍通过 http1.1 提供服务

已启用 http2 但仍通过 http1.1 提供服务

为了在我的 16.04 服务器上启用 HTTP/2,我按照以下方式操作本指南按照 Google 的建议,但出于某种原因,我的网站仍然通过 HTTP/1.1 提供服务。我反复检查一切是否正确,多次重启服务(和服务器!),但都无济于事。

  • http2mod 在 apache2 中已启用。
  • Protocols h2 h2c http/1.1已添加到我的站点配置文件中(并且刚刚在我的 apache.conf 中测试过)
  • 我已经重新启动服务和服务器

我是否遗漏了什么?

编辑:

刚刚运行curl -I -k --http2 https://framework.jacob.rocks/并收到以下内容...

HTTP/1.1 200 OK
Date: Thu, 20 Jul 2017 17:12:52 GMT
Server: Apache/2.4.27 (Ubuntu)
Upgrade: h2,h2c
Connection: Upgrade
Link: <https://framework.jacob.rocks/wp-json/>; rel="https://api.w.org/"
Link: <https://framework.jacob.rocks/>; rel=shortlink
X-TEC-API-VERSION: v1
X-TEC-API-ROOT: https://framework.jacob.rocks/wp-json/tribe/events/v1/
X-TEC-API-ORIGIN: https://framework.jacob.rocks
Content-Type: text/html; charset=UTF-8

答案1

搞清楚了,显然这只是一个mpm_prefork不支持 HTTP/2 的模块问题,从 Apache 开始2.4.27。我跟着本指南现在它起作用了!

答案2

Apache2 在 ubuntu 16.04 上默认编译时未支持 http2。

因此,您必须安装它的预编译版本,例如执行以下操作:

sudo add-apt-repository ppa:ondrej/apache2
sudo apt-get update
sudo apt-get dist-upgrade

或者按照下面的方法自己做:

检查 /etc/apt/sources.list 中是否有这些行:

deb-src http://archive.ubuntu.com/ubuntu/ xenial main universe restricted multiverse
deb-src http://security.ubuntu.com/ubuntu xenial-security main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main universe restricted multiverse

如果没有,请添加:

sudo echo 'deb-src http://archive.ubuntu.com/ubuntu/ xenial main universe restricted multiverse
deb-src http://security.ubuntu.com/ubuntu xenial-security main universe restricted multiverse
deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main universe restricted multiverse' >> /etc/apt/sources.list

然后安装一些所需的软件包(libnghttp2-dev 是提供 http2 支持所必需的):

sudo apt-get install curl devscripts build-essential libnghttp2-dev 
sudo apt-get build-dep apache2
sudo apt-get source apache2

然后编译:

cd apache-2.4.18
sudo su
./debian/rules binary

在此阶段,您可以安装生成的 deb,但它们可能会被稍后的安全更新覆盖,因此我们只需复制已生成的模块 http2 并创建一个文件以便能够启用它:

cp debian/apache2-bin/usr/lib/apache2/modules/mod_http2.so /usr/lib/apache2/modules/

然后创建文件http2.load来加载模块。

echo 'LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so
    <IfModule http2_module>
    LogLevel http2:info
    </IfModule>' > /etc/apache2/mods-available/http2.load

然后启用模块

a2enmod http2

然后重启apache

service apache2 restart

现在您就可以出发了。

答案3

如果你已经为网站启用了 SSL,则必须定义

Protocols h2 http/1.1

在 v-host 和 ssl conf 文件中,否则它将不起作用。

相关内容