日前,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读者交流群 )。