自從去年QQ空間移動端頁面開始切換到HTTPS以後,頁面性能遇到了比較大的挑戰,HTTPS對頁面訪問速度帶來了比較大的影響,因此咱們經過實踐總結了一些可以提高HTTPS頁面訪問速度的方法,這些數據都是咱們和STGW的同事反覆實驗、屢次分析所獲得的,但願可以減小你們對於全站啓用HTTPS的顧慮。咱們的目的是,在不影響用戶體驗的狀況下,不遺餘力保護用戶的信息安全!html
頁面在切到HTTPS以前,iOS的訪問速度約爲1795ms,切到HTTPS以後,iOS的訪問速度直接飆到2630ms,個人天吶,上漲了900ms,接近50%,嚇得我趕忙把入口又切回了HTTP。以後,便開始踏上了提高HTTPS訪問速度的道路。(文章裏的數據以iOS爲例,訪問速度指的是頁面html開始請求到頁面js執行完畢的耗時)。先簡單以圖示總結下咱們優化的結論:web
使用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的耗時。chrome
減小SSL握手的耗時,能夠有三個方式:瀏覽器
(1)提高TCP鏈接的複用率;安全
(2)提高SSL session的複用率;服務器
(3)減小頁面上的域名。session
對於提高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頁面優化結果
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