HTTP/2时代已经开启,不管是在HTTP1.X上苦苦做性能优化的你,还是没怎么做性能优化的你,都得该考虑升级HTTP/2了。因为HTTP/2的目的就是通过多路复用来减少延迟,通过头部压缩减少开销,同时增加对请求优先级和服务器端推送的支持。HTTP/2还带来其他协议层面的辅助实现,比如新的流量控制、错误处理和更新机制。所以我们应该在应用中好好利用它。从2015发布至今,一些Web服务器和多数的浏览器也都已经兼容HTTP/2。移动端Android5.0+、iOS9.0+开始兼容。
我们的Web服务器使用的是NginX,下面就参考NginX的白皮书《HTTP/2 for Web Application Developers》对NginX的HTTP/2升级做下实践介绍。
如下示意图,NginX与客户端建立的HTTP/2连接,与应用服务器可继续保持HTTP1.X连接。所以,HTTP/2可以分阶段升级,当前先支持客户端到Web服务器的连接,后续再升级Web服务器到应用服务器的连接(tomcat9开始支持HTTP/2,目前发布了beta版本)。
升级只需以下几步:
启用SSL
HTTP/2本身是不强制SSL的,但浏览器是要求的,所以需要先支持HTTPS访问。且站点全覆盖HTTPS也是大家已达成的共识,所以我们早早升级过,没升级的朋友先去支持HTTPS吧。这步我们就直接跳过了:)
升级OpenSSL到1.0.2或以上版本
(1)下载OpenSSL
地址:https://www.openssl.org/source/
(2)解压
tar –zxvf openssl-1.0.2n.tar.gz
(3)配置NginX
./configure --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-openssl=/解压目录/openssl-1.0.2n
(4)编译&安装
make && make install
(5)开启HTTP/2
server配置增加http2参数
server {
listen 443 sslhttp2default_server;
ssl_certificate server.crt;
ssl_certificate_key server.key;
…
}
(6)重启NginX
# nginx -s reload
(7)验证
升级前后访问对比
升级前访问图示
升级后访问图示
会发现连接数骤减,Protocol变成了h2。连接数的减少表明节省了多次连接的握手时间,降低了服务器的连接数损耗。
你可能会问不支持HTTP/2的客户端怎么办?请放心,HTTP/2是向前兼容的,不支持的HTTP/2继续用HTTP1.X协议访问即可。
去掉HTTP1.1的优化项
域名分区、文件拼接、图片精灵、内嵌文件等都要去掉,在HTTP/2下都是反模式并降低了性能。
到此完成现阶段的HTTP/2升级,大家可以动手尝试操作了。
关于HTTP/2协议
详细内容可以阅读百度开源的“HTTP2中英对照版”。
这里列下所增加的5个重要特性来吸引下大家:)
单一持久连接:一个网页只用一个连接
多路复用:请求和答复的消息帧在同一个连接上传输,解决了队首阻塞问题。
头部压缩和二进制分帧:头部可只推送差异数据;消息分解为互不依赖的二进制帧。
请求优先级:决定交付次序。
SSL加密:支持SSL,性能基本无损耗且更安全。
关于Web性能优化
难道升级了HTTP/2协议后就不用做性能优化了吗(黑人问号脸)?当然不是,HTTP/2的传输层仍然是TCP,所以对TCP的优化仍需继续。另外只要通过网络传输,追求传输内容的“少”和“小”就不能回避。
看下我们在《Web性能权威指南》所抽取HTTP的脑图或许更清晰,Web性能要点仍是持续关注的方面。对于性能的追求,只能是未完待续....
引用:
《HTTP/2 for Web Application Developers》
https://www.nginx.com/wp-content/uploads/2015/09/NGINX_HTTP2_White_Paper_v4.pdf
《Web性能权威指南》[美]Ilya Grigorik 著 李松峰 译
“HTTP2中英对照版”
https://github.com/fex-team/http2-spec
领取专属 10元无门槛券
私享最新 技术干货