Apache服务器启用HTTP/2支持

本文最后更新于:2019-05-09

本文简单介绍了Ubuntu Server下Apache服务器启用HTTP/2支持的方法,亦可直接参考这里(英文)

关于HTTP/2

HTTP/2是自HTTP/1.1于1999年发布以来对HTTP协议的首次更新,其标准于2015年发布在RFC 7540,目前大多数浏览器,包括Chrome、Firefox、Edge、IE 11等均支持HTTP/2
HTTP/2包括TLS 1.2及以上版本加密连接下的h2,以及非安全连接下的h2c,其保留了HTTP/1.1的大多数语义,二者最大的区别在于HTTP/2使用二进制帧来传输数据,而非明文。同时,HTTP/2还支持多路复用,在同一个TCP连接下传输多个请求;
服务器推送(Server Push)可以使服务端预先推送所需资源到客户端,而不用等待客户端主动发送请求。关于HTTP/2的其他一些特性及其具体解释可自行谷歌搜索,在此不详述。

Apache服务器启用HTTP/2

Apache从2.4.17版本开始支持HTTP/2,因此在启用前请确认Apache版本符合要求。以及,由于多数主流浏览器仅在TLS连接下支持HTTP/2,因此请保证系统的SSL服务支持ALPN(应用层协议协商),如OpenSSL版本高于1.0.2,并配置好站点的HTTPS连接

首先,本文中使用的系统配置环境为Ubuntu Server 18.04 LTS,其他环境请自行替换成等价的步骤

启用Apache的http2模块并配置站点

使用sudo a2enmod http2来添加Apache模块,使用vim或者其他文本编辑器打开虚拟主机的配置文件,添加Protocols h2 http/1.1,配置文件应该类似如下形式(略去了部分内容)

1
2
3
4
5
6
7
8
<VirtualHost ...>
ServerName ...
...
Protocols h2 http/1.1
...
SSLEngine On
...
</VirtualHost>

修改完成后,执行sudo systemctl reload apache2使Apache重新加载修改后的配置文件

切换Apache的工作模式

完成配置文件的修改后,如果Apache运行在prefork模式下,则还需要切换到event模式,最新的Apache应该都支持这个模式。在prefork模式下,同一时间一个子进程连接只能响应一个请求,而客户端可能会同时发送多个请求,因此某些请求会被挂起,
这种情况下,http2模块将不会工作。

切换到event模式的动作也很简单,sudo a2dismod mpm_prefork禁用prefork模式后用sudo a2enmod mpm_event启用event模式即可,在这种模式下,还需要安装php-fpm并使用sudo a2enmod proxy_fcgi以启用php的FastCGI,保证php在event模式下的解析

检测HTTP/2的启用情况

一个方便的方法是打开Edge浏览器,打开开发者工具栏并访问站点,可以查看到协议类型

edge-http2


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议