NGINX 商业版添加对 HTTP/2 协议支持

  • 金灵杰

2015 年 9 月 22 日

话题:语言 & 开发架构

日前,NGINX 公司宣布,其最新发布的商业版(NGINX Plus R7)已经支持HTTP/2协议。

HTTP/2 是目前最新的超文本传输协议标准,它在 2015 年 2 月 17 日通过,并于 2015 年 5 月以RFC 7540正式发表。相较于 HTTP 1.1,HTTP/2 提供了连接复用、HTTP 头压缩、请求 / 响应管线化等技术,能够大大降低请求延时,同时增加了服务器推送能特性。目前,主流浏览器都已经支持HTTP/2 协议,大部分浏览器只支持基于传输层安全协议(Transport Layer Security, TLS)的 HTTP/2 协议实现。

早在一个月前,NGINX 为 NGINX 1.9.0 及以后版本提供了测试版补丁,实现对 HTTP/2 协议的支持。最近发布的 NGINX 商业版(NGINX Plus)已经对 HTTP/2 协议完整支持。对于现有站点,如果需要增加 HTTP/2 支持,对 NGINX 配置文件修改非常小,同时对客户端没有感知。

NGINX Plus R7 可以同时兼容 HTTP 1.1 和 HTTP/2,这样的实现可以针对不同客户端浏览器对 HTTP 协议的支持程度,自动选择最优的访问方式。

在上图架构中,NGINX Plus 的地位相当于“HTTP/2 网关”。在前端,NGINX Plus 和客户端浏览器进行交互,如果客户端支持 HTTP/2 协议,则 NGINX Plus 就会使用 HTTP/2 协议。同时,NGINX Plus 会通过 HTTP 1.X 协议和后端应用进行交互。这样,后段应用不需要进行修改,就支持了对外提供 HTTP/2 服务。对于只支持 HTTP 1.X 协议的客户端,NGINX Plus 同样可以回退到 HTTP 1.X 协议,以提高兼容性。

由于 NGINX Plus 需要同时支持 HTTP/2 协议和 HTTP 1.X 协议,NGINX Plus 使用传输层安全协议中的下一代协议协商(Next Protocol Negotiation,NPN)扩展。当浏览器连接到 NGINX Plus 并进行传输层协议协商的时候,会提供自己支持的协议类型。如果浏览器声明自己支持 HTTP/2(提供的协议列表中包含 h2),在后续的应用层协议传输中,NGINX Plus 将使用 HTTP/2 协议。如果浏览器不支持 HTTP/2,甚至不支持 NPN 的时候,NGINX Plus 会降级到 HTTP 1.X 协议。

要在 NGINX Plus 中添加 HTTP/2 的支持,只需要在配置文件中进行简单的修改,即在listen 命令中添加 http2 参数。需要注意的是,http2 参数必须和 ssl 参数同时出现,和大多数浏览器实现一样,NGINX Plus 中实现的 HTTP/2 协议,也是必须构建于传输层安全协议之上。一个简单的配置如下:

server {
    listen 443 ssl http2 default_server;
}

另外需要注意的是,NGINX Plus 的 HTTP/2 模块移除了对 SPDY 协议的支持。因此 NGINX 无法同时支持 HTTP/2 协议和 SPDY 协议。不过,Google 已经官方宣布将不再支持 SPDY 协议,并计划于 2016 年在 Chrome 中移除 SPDY 协议。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

语言 & 开发架构