HTTP/2 升级

http2目前已经发布了大半年,最近也已经将公司的服务器从http1.x升级到http2,现在将在研究和升级http2一些经验整理如下,以备不时之需。

http2是基于Google的spdy协议进行编写的,与spdy区别的地方在于他们cipher的协商方式的不同,http2是基于ALPN(Application Layer Protocol Negotiation),而spdy是基于NPN(Next Protocol Negotiation),alpn与npn最大的区别在于alpn是客户端提供ciphers,服务器会根据客户端提供的ciphers来决定使用哪一个ciphers,而NPN与之恰恰相反。由于客户端提供ciphers,服务端可以从客户端所提供的ciphers中挑选出来一个支持的,安全性比较高的ciphers。

http2和http1.x之间的区别在于,http2为二进制的传输协议,同时它的表现方式有点类似于tcp的长连接,在client与server建立连接的时候,只会建立一个连接,而且所有的数据都会通过这个连接进行传递,http2目前仅支持https,虽然在http2的rfc文档中提供了h2和h2c两种,但是各大厂目前却都只实现了h2,h2c虽然也可以在一些开源库中找到(如nghttp2),但是能用https还是用https吧,就酱。

http2升级准备

鉴于我们所使用的web服务器为nginx,对nginx作了比较多的了解,nginx1.9.5+即可支持http2,在编译nginx的时候,需要加上`--with-http_v2_module`,同时需要确认openssl的版本是要大于`1.0.2g`,这些信息可以通过`nginx -V`所打印出来的信息中得知。目前为止,nginx仍不支持http2的server push功能,其他的基础功能支持尚好。

更新nginx的配置文件中的ssl相关选项可以使用[mozilla][1]提供的ssl配置生成器所生成的文件,升级过程中,一些被废弃的ssl_ciphers如果在ssl握手的时候被选中,可能会出现协商失败的问题。因为http2数据传输前需要经历tcp连接,alpn协商,ssl协商,如果alpn协商的结果为h2,而ssl协商的cipher为http2的black list中的一员,浏览器就会死给你看,无法显示正确的内容。

你可能感兴趣的:(技术)