刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。
最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。
源码
你可以从这里得到 Apache 版本。Apache 2.4.17 及其更高版本都支持 HTTP/2。我不会再重复介绍如何构建该服务器的指令。在很多地方有很好的指南,例如这里。
(有任何这个试验性软件包的相关链接?在 Twitter 上告诉我吧 @icing)
编译支持 HTTP/2
在你编译版本之前,你要进行一些配置。这里有成千上万的选项。和 HTTP/2 相关的是:
-
--enable-http2
启用在 Apache 服务器内部实现该协议的 ‘http2’ 模块。
-
--with-nghttp2=<dir>
指定 http2 模块需要的 libnghttp2 模块的非默认位置。如果 nghttp2 是在默认的位置,配置过程会自动采用。
-
--enable-nghttp2-staticlib-deps
很少用到的选项,你可能想将 nghttp2 库静态链接到服务器里。在大部分平台上,只有在找不到共享 nghttp2 库时才有用。
如果你想自己编译 nghttp2,你可以到 nghttp2.org 查看文档。最新的 Fedora 以及其它版本已经附带了这个库。
TLS 支持
大部分人想在浏览器上使用 HTTP/2, 而浏览器只在使用 TLS 连接(https:// 开头的 url)时才支持 HTTP/2。你需要一些我下面介绍的配置。但首先你需要的是支持 ALPN 扩展的 TLS 库。
ALPN 用来协商negotiate服务器和客户端之间的协议。如果你服务器上 TLS 库还没有实现 ALPN,客户端只能通过 HTTP/1.1 通信。那么,可以和 Apache 链接并支持它的是什么库呢?
- OpenSSL 1.0.2 及其以后。
- ??? (别的我也不知道了)
如果你的 OpenSSL 库是 Linux 版本自带的,这里使用的版本号可能和官方 OpenSSL 版本的不同。如果不确定的话检查一下你的 Linux 版本吧。
配置
另一个给服务器的好建议是为 http2 模块设置合适的日志等级。添加下面的配置:
1 2 3 4 5 6 |
|
当你启动服务器的时候,你可以在错误日志中看来类似的一行:
1 2 |
|
协议
那么,假设你已经编译部署好了服务器, TLS 库也是最新的,你启动了你的服务器,打开了浏览器。。。你怎么知道它在工作呢?
如果除此之外你没有添加其它的服务器配置,很可能它没有工作。
你需要告诉服务器在哪里使用该协议。默认情况下,你的服务器并没有启动 HTTP/2 协议。因为这样比较安全,也许才能让你已有的部署可以继续工作。
你可以用新的 Protocols 指令启用 HTTP/2 协议:
1 2 3 4 5 6 |
|
你可以给整个服务器或者指定的 vhosts 添加这个配置。
SSL 参数
对于 TLS (SSL),HTTP/2 有一些特殊的要求。阅读下面的“ https:// 连接”一节了解更详细的信息。
http:// 连接 (h2c)
尽管现在还没有浏览器支持,但是 HTTP/2 协议也工作在 http:// 这样的 url 上, 而且 mod_h[ttp]2 也支持。启用它你唯一所要做的是在 Protocols 配置中启用它: