【全文轉(zhuǎn)載自】Qzone高性能HTTPS實(shí)踐
WeTest導(dǎo)讀
自從去年QQ空間移動端頁面開始切換到HTTPS之后纵朋,頁面性能遇到了比較大的挑戰(zhàn)悉尾,HTTPS對頁面訪問速度帶來了比較大的影響熊响,所以我們通過實(shí)踐總結(jié)了一些能夠提升HTTPS頁面訪問速度的方法播演,這些數(shù)據(jù)都是我們和STGW的同事反復(fù)實(shí)驗(yàn)孽江、多次分析所得到的,希望能夠減少大家對于全站啟用HTTPS的顧慮休建。我們的目的是,在不影響用戶體驗(yàn)的情況下评疗,竭盡全力保護(hù)用戶的信息安全测砂!
頁面在切到HTTPS之前,iOS的訪問速度約為1795ms百匆,切到HTTPS之后砌些,iOS的訪問速度直接飆到2630ms,我的天吶加匈,上漲了900ms存璃,接近50%,嚇得我趕緊把入口又切回了HTTP雕拼。之后纵东,便開始踏上了提升HTTPS訪問速度的道路。(文章里的數(shù)據(jù)以iOS為例啥寇,訪問速度指的是頁面html開始請求到頁面js執(zhí)行完畢的耗時)偎球。先簡單以圖示總結(jié)下我們優(yōu)化的結(jié)論:
使用SPDY協(xié)議是我們優(yōu)化的第一步,SPDY(speedy)是Google很早就提出的協(xié)議辑甜,通過多路復(fù)用衰絮、請求優(yōu)先級以及HTTP報頭壓縮,來提升頁面的訪問速度磷醋。但是公司貌似沒有一個統(tǒng)一的平臺支持SPDY猫牡,在尋求了TEG小伙伴的幫助之后,他們首次支持了SPDY子檀。SPDY在iOS的兼容性比較好镊掖,iOS 8.0以上的safari和webview都支持乃戈,覆蓋了Qzone 85%以上的iOS用戶蝴蜓。所以決定開啟HTTPS+SPDY試試效果策泣。開啟SPDY之后的頁面訪問速度提升了370ms,已經(jīng)非常不錯了勇皇。(在SPDY的兼容性上归薛,iOS大部分都支持了谍憔,而安卓tbs內(nèi)核支持SPDY的版本也正在灰度當(dāng)中,全量之后預(yù)計也能覆蓋80%的Qzone用戶主籍。)
根據(jù)第一次SPDY的嘗試习贫,HTTPS的訪問速度有了300多毫秒的提升,但跟HTTP相比差距還是有400ms的差距千元,分析了一下苫昌,這400ms的差距主要是來自于SSL握手的耗時,根據(jù)SPDY協(xié)議幸海,每個域名建立一個TCP連接祟身,各自要進(jìn)行一次SSL握手,每次耗時約200ms物独,頁面一共有兩個關(guān)鍵域名袜硫,所以HTTPS+SPDY一共比HTTP慢了400ms。根據(jù)這個分析結(jié)果挡篓,我們也有了進(jìn)一步的優(yōu)化方向婉陷,那就是減少SSL的耗時。
減少SSL握手的耗時官研,可以有三個方式:
(1)提升TCP連接的復(fù)用率秽澳;
(2)提升SSL session的復(fù)用率;
(3)減少頁面上的域名戏羽。
對于提升TCP連接的復(fù)用率肝集,我們想了一個方法,在頁面的入口處預(yù)建了一個連接蛛壳,在用戶點(diǎn)擊入口之前杏瞻,先向h5.qzone.qq.com(頁面的域名)發(fā)起一個https請求,可以請求一個返回內(nèi)容為空的url衙荐。同時捞挥,服務(wù)器端要開啟keep alive, keep alive的時間也并不是越長越好,我們使用的是60秒忧吟。這個預(yù)建的連接砌函,不止減少了SSL握手的耗時,實(shí)際上同時也節(jié)省了TCP建立連接的時間。根據(jù)我們的實(shí)踐數(shù)據(jù)讹俊,在預(yù)建連接之后垦沉,頁面的訪問速度又提升了400ms。其中仍劈,TCP連接復(fù)用的命中率大約是75%厕倍。
** 對于提升SSL session 復(fù)用率,需要服務(wù)器端支持session ticket或者session cache贩疙,目前我們的STGW是支持了分布式session cache和全局session ticket key讹弯。需要說明一下的是,如果我們前面做了預(yù)建連接这溅,復(fù)用了TCP連接的請求不會再發(fā)生SSL握手组民,也就不需要session復(fù)用。不過還是分享下我們SSL session復(fù)用的實(shí)踐數(shù)據(jù)悲靴。SSL session復(fù)用對大部分安卓用戶的提升非常明顯臭胜,可以把SSL握手耗時從之前的400ms優(yōu)化到100多ms。而對于iOS癞尚,由于本身機(jī)器性能更好庇楞,SSL 握手時間的耗時本身就比安卓用戶少,從之前的200ms優(yōu)化到100ms**否纬,提升了50%,并且iOS由于不支持session ticket蛋褥,只能使用session cache临燃,復(fù)用率比較低。SSL seesion總體的復(fù)用率大約是40%烙心。
對于減少頁面上的域名膜廊,前面說到頁面有兩個關(guān)鍵域名,一個是h5.qzone.qq.com淫茵,一個是cdn域名qzonestyle.gtimg.cn爪瓜。每個域名的SSL握手各多耗時200ms,所以另一個優(yōu)化的方式就是域名收歸匙瘪,把頁面收歸到只有一個域名铆铆,減少一次SSL握手的耗時。于是我們把頁面上qzonestyle.gtimg.cn的js通過代理的方式也收歸到h5.qzone.qq.com丹喻,使這個頁面只有一個關(guān)鍵域名薄货,而h5.qzone.qq.com在入口頁面已經(jīng)做了預(yù)建連接,最大程度減少了TCP和SSL的時間碍论。域名收歸后谅猾,頁面的訪問速度提升了200ms。這種代理收歸的方式,也有另一個好處税娜,Qzone由于業(yè)務(wù)復(fù)雜坐搔,域名非常多,通過中間層代理收歸域名敬矩,再轉(zhuǎn)發(fā)到各個業(yè)務(wù)概行,這樣切換HTTPS對各個業(yè)務(wù)都是透明的,可以說大大降低了我們?nèi)厩袚Q到HTTPS的開發(fā)成本谤绳。
推薦使用的TLS協(xié)議和cipher suite占锯,在協(xié)議和算法層面,我們也做了一些統(tǒng)計來進(jìn)行對比缩筛。在HTTPS握手過程中記錄協(xié)議類型消略、加密套件、握手時間瞎抛,并且將上述內(nèi)容返回給頁面艺演。頁面在記錄用戶的訪問速度之后,上報數(shù)據(jù)的同時桐臊,把上述的協(xié)議類型等數(shù)據(jù)也一同上報胎撤。
從上表可以看出來,TLS1.2協(xié)議的性能要明顯優(yōu)于1.1和1.0断凶。Cipher suite 方面伤提,ECDHE-RSA-AES128-GCM-SHA256和ECDHE-RSA-AES128-SHA256性能最好。ECDHE-RSA-CHACHA20-POLY1305理論上講對性能提升有較大幫助认烁,但是由于iOS不支持該類算法肿男,所以從數(shù)據(jù)樣本上無法體現(xiàn)優(yōu)勢。除了上面所列出來的却嗡,后續(xù)我們依然會進(jìn)行協(xié)議和算法層面的更多性能分析和優(yōu)化舶沛,包括TCP參數(shù)調(diào)優(yōu),握手過程優(yōu)化窗价,SSL record size適配等如庭。
做了以上這些優(yōu)化之后,HTTPS的頁面訪問速度提升了1000+ms撼港,相比HTTP坪它,差距已經(jīng)非常小了。由于TCP復(fù)用帝牡,甚至比之前的訪問速度還要快哟楷。同時,我們還在馬不停蹄地做更多的嘗試否灾,比如開始寫這篇文章的時候還在用SPDY卖擅,寫到結(jié)尾的時候我們已經(jīng)啟用了HTTP/2(喂,難道不是因?yàn)樽髡呤峭涎影Y患者嗎?3徒住)親挎狸,你還有什么理由再不啟用HTTPS?
如何測試HTTPS頁面優(yōu)化結(jié)果
下面断楷,我們來看一下如何測試HTTPS頁面優(yōu)化結(jié)果
1) 點(diǎn)擊進(jìn)入壓測大師產(chǎn)品首頁(http://wetest.qq.com/gaps/ )開通項(xiàng)目锨匆,創(chuàng)建測試,點(diǎn)擊進(jìn)入URL測試冬筒。名稱和描述可以自己填寫恐锣。(圖中示例起始人數(shù)50人,每隔60秒增加50人舞痰,加到200人為上限)
點(diǎn)擊左側(cè)“HTTP直壓“進(jìn)入壓測
輸入合適的測試標(biāo)題和測試設(shè)置
(此圖為動圖土榴,橫屏觀看效果更佳)
2)新建一個客戶端請求,接口壓測包括讀寫接口响牛,讀接口基本是GET請求玷禽,寫接口基本是POST請求。GET請求使用url請求參數(shù)呀打,填寫測試用例的基礎(chǔ)數(shù)值矢赁,選擇正確的URL
配置頁面header信息
3) 隨后進(jìn)行Header的配置,Header的名稱在選定URL的內(nèi)贬丛,打開URL的鏈接(推薦使用chrome瀏覽器)撩银,敲擊F12并刷新頁面,選定Network-Name-Headers-Request Headers(Header的名稱與值均在內(nèi)查看豺憔,如下圖所示)
查看頁面header信息
到這里额获,基本就完成了對https的配置過程了,是不是很簡單焕阿?下面動圖可以再回顧一下操作的流程:
gif動態(tài)圖展示操作的流程
(此圖為動圖,橫屏觀看效果更佳)
WeTest壓測大師運(yùn)用了沉淀十多年的內(nèi)部實(shí)踐經(jīng)驗(yàn)總結(jié)首启,通過基于真實(shí)業(yè)務(wù)場景和用戶行為進(jìn)行壓力測試暮屡,幫助游戲開發(fā)者發(fā)現(xiàn)服務(wù)器端的性能瓶頸,進(jìn)行針對性的性能調(diào)優(yōu)毅桃,降低服務(wù)器采購和維護(hù)成本褒纲,提高用戶留存和轉(zhuǎn)化率。
功能目前免費(fèi)對外開放中钥飞,點(diǎn)擊http://wetest.qq.com/gaps 即可體驗(yàn)莺掠!
如果對使用當(dāng)中有任何疑問,歡迎聯(lián)系騰訊WeTest企業(yè)qq:800024531