当前位置 主页 > 服务器问题 > Linux/apache问题 >

    详解为新版Apache服务器开启HTTP/2支持的方法

    栏目:Linux/apache问题 时间:2019-10-07 22:20

    HTTP 2.0简介
    HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议。是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小组进行开发。是自1999年http1.1发布后的首个更新。HTTP 2.0在2013年8月进行首次合作共事性测试。在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。

    IETF会让所有互联网通路默认选择的方式来引入加密,互联网专家们将新一代加密协议称为“HTTP 2.0”。

    协议目标:

    异步连接多路复用; 头部压缩; 请求/响应管线化;

    保持与HTTP 1.1语义的向后兼容性也是该版本的一个关键目标。SPDY是一种HTTP兼容协议,由Google发起,Chrome、Opera、Firefox以及Amazon Silk等浏览器均已提供支持。HTTP实现的瓶颈之一是其并发要依赖于多重连接。HTTP管线化技术可以缓解这个问题,但也只能做到部分多路复用。此外,已经证实,由于存在中间干扰,浏览器无法采用管线化技术。SPDY在单个连接之上增加了一个帧层,用以多路复用多个并发流。帧层针对HTTP类的请求响应流进行了优化,因此运行在HTTP之上的应用,对应用开发者而言只要很小的修改甚至无需修改就可以运行在SPDY之上。SPDY对当前的HTTP协议有4个改进:

    多路复用请求; 对请求划分优先级; 压缩HTTP头; 服务器推送流(即Server Push技术);

    SPDY试图保留HTTP的现有语义,所以cookies、ETags等特性都是可用的。[3]

    如何在 Apache 中启用 HTTP/2
    刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。

    最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。
    编译支持 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 模块设置合适的日志等级。添加下面的配置:

    # 放在某个地方的这样一行
    LoadModule http2_module modules/mod_http2.so
    <IfModule http2_module>
      LogLevel http2:info
    </IfModule>