Qzone移动端页面去年在切换至HTTPS后,页面加载速度遇到了较大的挑战,出现了较大的上升趋势。为了解决这个问题,Qzone前端以及运维团队通过反复实验、分析,在实践中总结了一些方法,有效提升了HTTPS页面的访问速度。希望本文能够帮助提高用户在全站HTTPS环境上的体验,减少大家对全站启用HTTPS的顾虑。毕竟用户的体验同用户信息安全是一样重要的。

以iOS平台为例。Qzone页面在在切换至HTTPS之前,平均访问速度约为1795ms。切换至HTTPS之后,平均访问速度直接飙升至2630ms。我的天呐,上涨了900ms,幅度接近50%。为了保障用户的正常体验,吓得我赶紧把入口又切回了HTTP。

在这之后,为了兼顾体验和安全,我们便开始踏上了提升HTTPS访问速度的道路。先简单以图示总结下我们优化的结论:

文章里的数据以iOS为例,访问速度指的是页面html开始请求到页面js执行完毕的耗时

使用SPDY协议是我们优化的第一步。SPDY(speedy)是Google早年提出的网络通信协议。它通过多路复用、请求优先级以及HTTP报头压缩等方法,能够有效提升页面访问速度。SPDY在iOS系统上兼容性较好,iOS 8.0及以上版本的Safari浏览器以及WebView组件均支持,覆盖了Qzone 85%以上的用户。

基于以上统计结论,我们针对iOS平台上的用户启用了HTTPS+SPDY协议。数据显示,在开启SPDY之后页面访问速度提升了约370ms,是一个相当可观的数据。

在Android系统上,手机QQ以及微信中的WebView是使用了腾讯浏览服务(升TBS)内核,目前支持SPDY的版本正在灰度发布中,预期全面发布后能够覆盖80%的Qzone用户。

在iOS平台上完成了SPDY的改造后,HTTPS的访问速度虽然有了370ms的提升,但同HTTP相比仍有400ms的差距。经过进一步的分析, 这400ms的时间差主要集中在了SSL握手的阶段上。根据SPDY协议,每个域名需要单独同服务器建立TCP连接,各自要进行一次SSL握手,每次耗时约200ms。根据这个分析结果,我们也有了进一步的优化方向,那就是减少SSL的耗时。

要减少SSL握手的耗时,可以有三个方式:

  1. 提升TCP连接的复用率
  2. 提升SSL session的复用率
  3. 减少页面中请求域名的数量

对提升TCP连接的复用率,Qzone团队的解决方案是,在页面的入口处预建了一个连接,用户点击入口之前,先向h5.qzone.qq.com(Qzone移动端页面域名)发起一个https请求,请求的结果完全可是一个空内容,同时服务器端要启用keep alive。keep alive设定的时间并非越长越好,根据我们的反复实验,最终将这个数值确定为60s。这个预建的连接,不仅仅能起到减少了SSL握手耗时的作用,实际上也能减少TCP建立的时间。在实施了页面入口预请求之后,统计出用户访问页面平均速度又降低了400ms,其中预请求复用的命中率大约是75%。

对提升SSL session复用率,需要服务器端支持session ticket或者session cache,目前Qzone运维团队已经做到了能够支持分布式session cache和全局session ticket key。这里需要说明的是,如果我们按上文所说做了预建连接,复用了TCP连接的请求是不会再发生SSL握手的,那么这里也就不需要太多关注session复用的问题。不过这里还是分享一下Qzone在启用SSL session复用后的实践数据。SSL session复用对大部分Android用户的提升非常明显,可以将SSL握手耗时从400ms优化至100ms。但对于iOS的用户,由于iOS平台本身对于性能的优化,SSL握手时间耗时比Android用户低不少,耗时从200ms降至了100ms。SSL seesion的复用率大约是40%。

对减少页面上的域名,Qzone移动端的业务主要涉及两个关键域名,一个是nodejs服务器h5.qzone.qq.com,另一个是CDN域名qzonestyle.gtimg.cn,每个域名的SSL握手各自需要额外耗时200ms。因此我们需要做的就是将页面上的域名收归,尽量使用一个域名,以减少SSL握手次数。我们通过ndoejs服务器做HTTP代理,将qzonestyle.gtimg.cn域名上的静态文件收归到h5.qzone.qq.com,而上文已经提到,h5.qzone.qq.com在页面的入口处已经做了预建连接。因此域名收归后,页面整体的访问速度又提升了200ms。

通过服务器代理收归域名除了能够减少SSL握手次数,还有一个好处就是对于像Qzone这种业务复杂、域名繁多的产品,无论之前页面上用了多少域名,都可以通过服务器代理的方式,将域名收归至一个。这样在业务从HTTP切换至HTTPS的时候,原有各业务均可以保持HTTP不变,大大降低了全站切换HTTPS的开发成本。

除了上面三种减少SSL握手时间的方式,我们在SSL协议和算法上也做了一些统计对比。在HTTPS握手过程中记录协议类型、加密套件、握手时间,并且将上述内容返回给页面。页面在记录用户的访问速度之后,上报数据的同时,把上述的协议类型等数据也一同上报。

从上表可以看出来,TLS1.2协议的性能要明显优于1.1和1.0。Cipher suite 方面,ECDHE-RSA-AES128-GCM-SHA256和ECDHE-RSA-AES128-SHA256性能最好。ECDHE-RSA-CHACHA20-POLY1305理论上讲对性能提升有较大帮助,但是由于iOS平台暂时不支持该类算法,因此从数据样本上无法体现优势。后续Qzone团队会继续在协议和算法层面做更多的性能分析和优化,包括TCP参数调优,握手过程优化,SSL record size适配等。

经过以上几个小手术,HTTPS的页面合计访问速度提升超过了1000ms,同相比HTTP相比差距几乎可以忽略。同时由于TCP复用,在某些场景上甚至比HTTP的访问速度还快。

除了本文提到的SPDY技术,Qzone团队还在马不停蹄地做更多的尝试。例如开始写这篇文章的时候Qzone才正在实施SPDY,写到结尾的时候Qzone已经在部分地区启用了HTTP/2(喂,难道不是因为作者是拖延症患者吗?!)所以亲们,你还有什么理由再不全站启用HTTPS呢?

文章转载自:Qzone前端

文章来源于腾讯云开发者社区,点击查看原文