WeTest导读

自从去年QQ空间移动端页面开始切换到HTTPS之后,页面性能遇到了比较大的挑战,HTTPS对页面访问速度带来了比较大的影响,所以我们通过实践总结了一些能够提升HTTPS页面访问速度的方法,这些数据都是我们和STGW的同事反复实验、多次分析所得到的,希望能够减少大家对于全站启用HTTPS的顾虑。我们的目的是,在不影响用户体验的情况下,竭尽全力保护用户的信息安全!


页面在切到HTTPS之前,iOS的访问速度约为1795ms,切到HTTPS之后,iOS的访问速度直接飙到2630ms,我的天呐,上涨了900ms,接近50%,吓得我赶紧把入口又切回了HTTP。之后,便开始踏上了提升HTTPS访问速度的道路。(文章里的数据以iOS为例,访问速度指的是页面html开始请求到页面js执行完毕的耗时)。先简单以图示总结下我们优化的结论:

使用SPDY协议是我们优化的第一步,SPDY(speedy)是Google很早就提出的协议,通过多路复用、请求优先级以及HTTP报头压缩,来提升页面的访问速度。但是公司貌似没有一个统一的平台支持SPDY,在寻求了TEG小伙伴的帮助之后,他们首次支持了SPDY。SPDY在iOS的兼容性比较好,iOS 8.0以上的safari和webview都支持,覆盖了Qzone 85%以上的iOS用户。所以决定开启HTTPS+SPDY试试效果。开启SPDY之后的页面访问速度提升了370ms,已经非常不错了。(在SPDY的兼容性上,iOS大部分都支持了,而安卓tbs内核支持SPDY的版本也正在灰度当中,全量之后预计也能覆盖80%的Qzone用户。)

根据第一次SPDY的尝试,HTTPS的访问速度有了300多毫秒的提升,但跟HTTP相比差距还是有400ms的差距,分析了一下,这400ms的差距主要是来自于SSL握手的耗时,根据SPDY协议,每个域名建立一个TCP连接,各自要进行一次SSL握手,每次耗时约200ms,页面一共有两个关键域名,所以HTTPS+SPDY一共比HTTP慢了400ms。根据这个分析结果,我们也有了进一步的优化方向,那就是减少SSL的耗时。

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

(1)提升TCP连接的复用率;

(2)提升SSL session的复用率;

(3)减少页面上的域名。

对于提升TCP连接的复用率,我们想了一个方法,在页面的入口处预建了一个连接,在用户点击入口之前,先向h5.qzone.qq.com(页面的域名)发起一个https请求,可以请求一个返回内容为空的url。同时,服务器端要开启keep alive, keep alive的时间也并不是越长越好,我们使用的是60秒。这个预建的连接,不止减少了SSL握手的耗时,实际上同时也节省了TCP建立连接的时间。根据我们的实践数据,在预建连接之后,页面的访问速度又提升了400ms。其中,TCP连接复用的命中率大约是75%。

对于提升SSL session 复用率,需要服务器端支持session ticket或者session cache,目前我们的STGW是支持了分布式session cache和全局session ticket key。需要说明一下的是,如果我们前面做了预建连接,复用了TCP连接的请求不会再发生SSL握手,也就不需要session复用。不过还是分享下我们SSL session复用的实践数据。SSL session复用对大部分安卓用户的提升非常明显,可以把SSL握手耗时从之前的400ms优化到100多ms。而对于iOS,由于本身机器性能更好,SSL 握手时间的耗时本身就比安卓用户少,从之前的200ms优化到100ms,提升了50%,并且iOS由于不支持session ticket,只能使用session cache,复用率比较低。SSL seesion总体的复用率大约是40%。

对于减少页面上的域名,前面说到页面有两个关键域名,一个是h5.qzone.qq.com,一个是cdn域名qzonestyle.gtimg.cn。每个域名的SSL握手各多耗时200ms,所以另一个优化的方式就是域名收归,把页面收归到只有一个域名,减少一次SSL握手的耗时。于是我们把页面上qzonestyle.gtimg.cn的js通过代理的方式也收归到h5.qzone.qq.com,使这个页面只有一个关键域名,而h5.qzone.qq.com在入口页面已经做了预建连接,最大程度减少了TCP和SSL的时间。域名收归后,页面的访问速度提升了200ms。这种代理收归的方式,也有另一个好处,Qzone由于业务复杂,域名非常多,通过中间层代理收归域名,再转发到各个业务,这样切换HTTPS对各个业务都是透明的,可以说大大降低了我们全站切换到HTTPS的开发成本。

推荐使用的TLS协议和cipher suite,在协议和算法层面,我们也做了一些统计来进行对比。在HTTPS握手过程中记录协议类型、加密套件、握手时间,并且将上述内容返回给页面。页面在记录用户的访问速度之后,上报数据的同时,把上述的协议类型等数据也一同上报。

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

做了以上这些优化之后,HTTPS的页面访问速度提升了1000+ms,相比HTTP,差距已经非常小了。由于TCP复用,甚至比之前的访问速度还要快。同时,我们还在马不停蹄地做更多的尝试,比如开始写这篇文章的时候还在用SPDY,写到结尾的时候我们已经启用了HTTP/2(喂,难道不是因为作者是拖延症患者吗?!)亲,你还有什么理由再不启用HTTPS?

如何测试HTTPS页面优化结果

下面,我们来看一下如何测试HTTPS页面优化结果

1) 点击进入压测大师产品首页(http://wetest.qq.com/gaps/ )开通项目,创建测试,点击进入URL测试。名称和描述可以自己填写。(图中示例起始人数50人,每隔60秒增加50人,加到200人为上限)

输入合适的测试标题和测试设置(此图为动图,横屏观看效果更佳)

2)新建一个客户端请求,接口压测包括读写接口,读接口基本是GET请求,写接口基本是POST请求。GET请求使用url请求参数,填写测试用例的基础数值,选择正确的URL

配置页面header信息

3) 随后进行Header的配置,Header的名称在选定URL的内,打开URL的链接(推荐使用chrome浏览器),敲击F12并刷新页面,选定Network-Name-Headers-Request Headers(Header的名称与值均在内查看,如下图所示)

查看页面header信息

到这里,基本就完成了对https的配置过程了,是不是很简单?下面动图可以再回顾一下操作的流程:

gif动态图展示操作的流程(此图为动图,横屏观看效果更佳)


WeTest压测大师运用了沉淀十多年的内部实践经验总结,通过基于真实业务场景和用户行为进行压力测试,帮助游戏开发者发现服务器端的性能瓶颈,进行针对性的性能调优,降低服务器采购和维护成本,提高用户留存和转化率。

功能目前免费对外开放中,点击http://wetest.qq.com/gaps即可体验!

如果对使用当中有任何疑问,欢迎联系腾讯WeTest企业qq:800024531

Qzone 高性能 HTTPS 实践的更多相关文章

  1. 知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

    本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动 ...

  2. 【百度】大型网站的HTTPS实践(二)——HTTPS加密算法介绍

    大型网站的HTTPS实践(二)——HTTPS加密算法介绍 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:09:43  358  0 前言 在上一篇文章中,我们简要 ...

  3. 【百度】大型网站的HTTPS实践(一)——HTTPS协议和原理

    大型网站的HTTPS实践(一)——HTTPS协议和原理 原创 网络通信/物联网 作者:AIOps智能运维 时间:2018-11-09 15:07:39  349  0 前言 百度于2015年上线了全站 ...

  4. 17、Nginx HTTPS 实践

    1.HTTPS安全证书基本概述 为什么需要使用HTTPS, 因为HTTP不安全.当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡 ...

  5. Https实践

    https实践 常用端口 ssh 22 telnet 23 ftp 21 rsync 873 http 80 mysql 3306 redis 6379 https 443 dns 53 php 90 ...

  6. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路

    1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...

  7. 大型网站的 HTTPS 实践(三)——基于协议和配置的优化

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt389 1 前言 上文讲到 HTTPS 对用户访问速度的影响. 本文就为大家介 ...

  8. 大型网站的 HTTPS 实践(四)——协议层以外的实践

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt390 1 前言 网上介绍 https 的文章并不多,更鲜有分享在大型互联网站 ...

  9. nginx+tomcat https实践

    1. 安装ssl'证书 使用Let's Encrypt 的免费证书: 下载源代码: git clone https://github.com/letsencrypt/letsencrypt 我时阿里云 ...

随机推荐

  1. wampserver安装错误 应用程序无法正常启动0xc000007b解决方法

    在重装系统之后发现以前安装的wampserver启动会出现错误提示"应用程序无法正常启动0xc000007b解决方法",重新安装也是一样的错误.上网找了相关信息后发现,并不是只有本 ...

  2. Linux服务器性能查看分析调优

    一 linux服务器性能查看 1.1 cpu性能查看 1.查看物理cpu个数: cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc ...

  3. toastr.js插件用法

    toastr.js插件用法 toastr.js是一个基于jQuery的非阻塞通知的JavaScript库.toastr.js可以设定四种通知模式:成功.出错.警告.提示.提示窗口的位置.动画效果等都可 ...

  4. C#各个版本中的新增特性详解

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...

  5. 五子棋AI大战OC实现

    Gobang 五子棋AI大战,该项目主要用到MVC框架,用算法搭建AI实现进攻或防守 一.项目介绍 1.地址: github地址:Gobang 2.效果图: 二.思路介绍 大概说下思路,具体看代码实现 ...

  6. Devexpress 中对RedailMenu的使用

    最近项目中用到RadialMenu,效果图如下所示: 闲下来就对,devexpress中的RedialMenu的使用总结一下. 第一:假设RedialMenu中全部是BarButtonItem的情况. ...

  7. springmvc学习笔记(简介及使用)

    springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...

  8. C语言学习第七章

    今天开始学习指针,指针在C语言中具有很重要的地位,按照老师所说,学C学不好指针跟没学一样,可见指针在C语言中的重要地位.废话不多说,首先我们先要知道什么是指针. 指针:指针是一个变量,它存储另一个对象 ...

  9. 懵懂oracle之存储过程

    作为一个oracle界和厨师界的生手,笔者想给大家分享讨论下存储过程的知识,因为在我接触的通信行业中,存储过程的使用还是占据了一小块的地位. 存储过程是什么?不得不拿下百度词条的解释来:"存 ...

  10. 数据仓库Hive数据导入导出

    Hive库数据导入导出 1.新建表data hive (ebank)> create table data(id int,name string) > ROW FORMAT DELIMIT ...