1. 程式人生 > >HTTP/2 與 WEB 效能優化(三)

HTTP/2 與 WEB 效能優化(三)

提醒:本文最後更新於 1320 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

在連續寫了兩篇關於「HTTP/2 與 WEB 效能優化」的文章後,今天來寫這個系列的最後一篇。在正式開始之前,我們先來簡單回顧下之前兩篇文章:

HTTP/2 與 WEB 效能優化(一)」的結論是:HTTP/2 的 Server Push 機制,可以讓重要的 JS、CSS 等資源儘快載入,從而不再需要 HTTP/1 中「將重要資源內聯在頁面頭部」的優化方案了。

HTTP/2 與 WEB 效能優化(二)」的結論是:HTTP/2 支援了多路複用,HTTP 連線變得十分廉價,之前為了節省連線數所採用的類似於「資源合併、資源內聯」等優化手段不再需要了。多路複用可以在一個 TCP 連線上建立大量 HTTP 連線,也就不存在 HTTP 連線數限制了,HTTP/1 中常見的「靜態域名」優化策略不但用不上了,還會帶來負面影響,需要去掉。另外,HTTP/2 的頭部壓縮功能也能大幅減少 HTTP 協議頭部帶來的開銷。

但 HTTP/2 並不是萬能的,並不是說用了 HTTP/2 就不再需要效能優化了。我在本系統第二篇文章末尾寫到:

據官方預測,HTTP/1 至少還需要 10 年才能徹底退出歷史舞臺,另外儘管 HTTP/2 協議允許脫離 TLS 部署,但 Chrome 和 Firefox 都表示不支援非 TLS 的 HTTP/2,之後很可能一個網站會同時提供 HTTP/1.1、HTTP/1.1 over TLS、HTTP/2 over TLS 三種服務。如何在每種情況下,都能給使用者提供最好的體驗,需要更加深入的優化研究和更加精細的優化策略。

實際上,除了前兩篇文章中提到的這些需要為 HTTP/2 做出調整的優化策略之外,其餘大部分 HTTP/1 時期的優化策略依然有效。HTTP/1 的 WPO 並不是什麼新鮮話題,大家早就熟門熟路了,本文只打算列舉其中幾個:

啟用壓縮

壓縮的目的是讓傳輸的資料變得更小。我們的線上程式碼(JS、CSS 和 HTML)都會做壓縮,圖片也會做壓縮(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。對於文字檔案,在服務端傳送響應之前進行 GZip 壓縮也很重要,通常壓縮後的文字大小會減小到原來的 1/4 - 1/3。對程式碼進行內容壓縮已經有成熟的工具和標準流程了,而服務端的 GZip 更是標配,所以「壓縮」是一項收益投入比很高的優化手段。

使用 HTTP 快取

任何一個 WEB 專案,要提高效能,各個環節的快取必不可少。利用好 HTTP 協議的快取機制,可以大幅減少傳輸資料,減少請求,這又是一項收益投入比超高的優化手段。這裡把之前我寫的 HTTP/1.1 快取機制介紹翻出來:

首先,服務端可以通過響應頭裡的 Last-Modified(最後修改時間) 或者 ETag(內容特徵) 標記實體。瀏覽器會存下這些標記,並在下次請求時帶上 If-Modified-Since: 上次 Last-Modified 的內容If-None-Match: 上次 ETag 的內容,詢問服務端資源是否過期。如果服務端發現並沒有過期,直接返回一個狀態碼為 304、正文為空的響應,告知瀏覽器使用本地快取;如果資源有更新,服務端返回狀態碼 200、新的 Last-Modified、Etag 和正文。這個過程被稱之為 HTTP 的協商快取,通常也叫做弱快取。

可以看到協商快取並不會節省連線數,但是在快取生效時,會大幅減小傳輸內容(304 響應沒有正文,一般只有幾百位元組)。另外為什麼有兩個響應頭都可以用來實現協商快取呢?這是因為一開始用的 Last-Modified 有兩個問題:1)只能精確到秒,1 秒內的多次變化反映不出來;2)在輪詢的負載均衡演算法中,如果各機器讀到的檔案修改時間不一致,有快取無故失效和快取不更新的風險。HTTP/1.1 並沒有規定 ETag 的生成規則,而一般實現者都是對資源內容做摘要,能解決前面兩個問題。

另外一種快取機制是服務端通過響應頭告訴瀏覽器,在什麼時間之前(Expires)或在多長時間之內(Cache-Control: Max-age=xxx),不要再請求伺服器了。這個機制我們通常稱之為 HTTP 的強快取。

一旦資源命中強快取規則後,再次訪問完全沒有 HTTP 請求(Chrome 開發者工具的 Network 面板依然會顯示請求,但是會註明 from cache;Firefox 的 firebug 也類似,會註明 BFCache),這會大幅提升效能。所以我們一般會對 CSS、JS、圖片等資源使用強快取,而入口檔案(HTML)一般使用協商快取或不快取,這樣可以通過修改入口檔案中對強快取資源的引入 URL 來達到即時更新的目的。

這裡也解釋下為什麼有了 Expire,還要有 Cache-Control。也有兩個原因:1)Cache-Control 功能更強大,對快取的控制能力更強;2)Cache-Control 採用的 max-age 是相對時間,不受服務端 / 客戶端時間不對的影響。

另外關於瀏覽器的重新整理(F5 / cmd + r)和強刷(Ctrl + F5 / shift + cmd +r):普通重新整理會使用協商快取,忽略強快取;強刷會忽略瀏覽器所有快取(並且請求頭會攜帶 Cache-Control:no-cache 和 Pragma:no-cache,用來通知所有中間節點忽略快取)。只有從位址列或收藏夾輸入網址、點選連結等情況下,瀏覽器才會使用強快取。

減少 DNS 查詢

我們知道,建立 TCP 連線需要知道目標 IP,而絕大部分時候給瀏覽器的是域名。瀏覽器需要先將域名解析為 IP,這個過程就是 DNS 查詢,一般需要幾毫秒到幾百毫秒,移動環境下會更慢。DNS 解析完成之前,請求會被 Block。瀏覽器一般都會快取 DNS 查詢結果,頁面使用的域名(包括子域名)越少,花費在 DNS 查詢上的開銷就越小。另外,合理使用瀏覽器的 DNS Prefetching 技術,也是很好的做法。

減少重定向

無論是通過服務端響應頭產生的重定向,還是通過 <meta> 或者 JS 產生的重定向,都可能引入新的 DNS 查詢、新的 TCP 連線以及新的 HTTP 請求,所以減少重定向也很重要。瀏覽器基本都會快取通過 301 Moved Permanently 指定的跳轉,所以對於永久性跳轉,可以考慮使用狀態碼 301。對於啟用了 HTTPS 的網站,配置 HSTS 策略,也可以減少從 HTTP 到 HTTPS 的重定向。

WEB 效能優化是一個系統工程,不可能在這一篇文章裡寫完,我決定先就寫到這兒。最後,推薦一個 Chrome 擴充套件:HTTP/2 and SPDY indicator,它可以在位址列顯示當前網站是否啟用了 SPDY 或者 HTTP/2,點選圖示可以直接開啟 Chrome 的 HTTP/2 的除錯介面,十分方便。

--EOF--

提醒:本文最後更新於 1320 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

HTTP/2 WEB 效能優化

提醒:本文最後更新於 1320 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 在連續寫了兩篇關於「HTTP/2 與 WEB 效能優化」的文章後,今天來寫這個系列的最後一篇。在正式開始之前,我們先來簡單回顧下之前兩篇文章: 「HTTP/2 與 WEB 效能優化(一)」的結論是:HTTP/2

HTTP/2 WEB 效能優化

提醒:本文最後更新於 1327 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 在「HTTP/2 與 WEB 效能優化(一)」這篇部落格中,我主要寫了 HTTP/2 中的 Server Push 給 WEB 效能優化帶來的便利,今天繼續來聊一聊 HTTP/2 其他方面的改變。 我們知道,HT

HTTP/2 WEB 效能優化

提醒:本文最後更新於 1333 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 2013 年 11 月份開始,我的部落格開始支援了 SPDY 協議(詳見這裡),也就是 HTTP/2 的前身。今年二月份,Google 宣佈將在 16 年初放棄對 SPDY 的支援,隨後 Google 自家支援

Web前端效能優化新增Expires頭

什麼是Expires頭? Expires儲存的是一個用來控制快取失效的日期。當瀏覽器看到響應中有一個Expires頭時,它會和相應的元件一起儲存到其快取中,只要元件沒有過期,瀏覽器就會使用快取版本而不會進行任何的HTTP請求。Expires設定的日期格式必須為GMT

JVM效能優化:垃圾收集

原文地址,譯文地址,譯者:Greenster Java平臺的垃圾收集機制顯著提高了開發者的效率,但是一個實現糟糕的垃圾收集器可能過多地消耗應用程式的資源。在Java虛擬機器效能優化系列的第三部分,Eva Andreasson向Java初學者介紹了Java平臺的記憶體模型和垃圾收集機制。她解釋了

使用UE4開發VR專案_效能優化_思路和方法

  本文是《使用UE4開發VR專案-效能優化》的第三篇。希望能和您分享一下在UE4 VR專案優化的基本思路方法和技巧。   前篇請參考這裡: (四)GPU渲染執行緒分析   如果遇到GPU瓶頸最快的驗證方法是改變解析度 降低解析度可以極大提高幀數   如果幀數有大幅度提高 即是GPU瓶頸。如果影響不大

WEB效能優化:Resin下的 GZIP壓縮

最近在做前端的效能優化,發現一個頁面引入的js、css等外部資源過多的話,瀏覽器第一次請求的時候會下載很大的資源,那麼在使用者網路不好的情況下,頁面的載入速度會受很大的影響,因此要對WEB前端做各種優化。 在此第一步做的就是所有資源的壓縮,在開發環境編寫好的js和css檔案

淺談前端效能優化——對HTTP傳輸進行壓縮

1、前端效能優化的一點: 對js、css、圖片等進行壓縮,儘可能減小檔案的大小,減少檔案下載的時間,從而減少網頁響應的時間。   2、前端效能優化的另一點: 對HTTP傳輸進行壓縮,即在js,css、圖片等資源已經壓縮的基礎上(其實,檔案的壓縮與否均可,檔案的壓縮跟HTTP傳輸過程的壓縮沒關

手遊客戶端的效能----Unity和C#版具體優化--UGUI,資源規範等

接上篇: 4、Enum:列舉當Key使用或列舉轉換為String,都會有GC 5、閉包:函式和與其相關的引用環境組合成的實體。閉包IL程式碼會出個新類,頻繁呼叫一個函式時,儘量不用。 6、其他       1>update中沒必要每幀的。 &n

淺談JavaSE效能優化1——BufferedImage畫素級渲染

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

web前端學習css學習筆記部分5-- CSS動畫--頁面特效、HTMLCSS3簡單頁面效果實例

key cti 樣式 描述 ans 轉換方法 動畫效果 ansi order CSS動畫--頁面特效部分內容目前僅僅觀看了解內容,記錄簡單筆記,之後工作了進行內容的補充 7. CSS動畫--頁面特效 7.1 2D、3D轉換   7.1.1 通過CSS3轉換,我們能夠對

Web前端效能優化

1. 靜態資源的壓縮與合併 我們在開發的時候會習慣縮排和寫註釋,方便我們在日常的維護,但將程式碼上傳至服務端後,我們完全可以把那些空格、製表符、換行符進行壓縮,以此減少請求資源的大小;同樣的,我們在服務端所引用的第三方庫進行合併,能減少 HTTP 的請求數量 將

SpringMVC之Web引入靜態資源規範請求字尾

1.Spring3+以上的版本可以直接在springmvc-servlet.xml裡面直接設定:     <mvc:annotation-driven />        <mvc

前端效能優化-- 檔案的壓縮合併

首先我們需要搞清楚,我們為什麼需要進行檔案的壓縮與合併?壓縮與合併的原因主要有兩點 減少HTTP請求數 減小HTTP的請求大小 這裡的主要優化方式有3點: HTML/CSS/JS檔案的壓縮 CSS/JS檔案的合併 開啟GZIP壓縮 如何進行HTML壓縮 使用線上網站壓縮

從零開始學 Web 之 DOMinnerTextinnerHTML、自定義屬性

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、相容程式碼 1

Linux效能優化之磁碟優化

前言 關於本章內容,設計的東西比較多。這裡會有關於檔案系統、磁碟、CPU等方面的知識,以及涉及到關於這方面的效能排查等。 術語 檔案系統通過快取和緩衝以及非同步I/O等手段來緩和磁碟的延時對應用程式的影響。為了更詳細的瞭解檔案系統,以下就簡單介紹一些相關術語: 檔案系統:一種把資料組織成檔案和目錄的儲存方式

Web Service筆記:wsdl soap協議詳解

一、WSDL語言:(web service definition language - web service定義語言) (一)簡介: 2、wsdl 文件描述了 ws 主要的3個方面: 1)WHATA:該 ws 包含”什麼“操作,即有幾個方法。 2)HOW:該 ws

Web前端效能優化減少DNS查詢、避免重定向

一、減少DNS查詢 基礎知識 DNS(Domain Name System): 負責將域名URL轉化為伺服器主機IP。 DNS查詢流程:首先檢視瀏覽器快取是否存在,不存在則訪問本機DNS快取,再不存在則訪問本地DNS伺服器。所以DNS也是開銷,通常瀏覽器查詢一個

Storm 使用經驗效能優化

提交任務:storm jar storm-starter-topologies-1.0.1.jar org.apache.storm.starter.WordCountTopology word-count查詢任務:storm list Kill任務:storm kill

nginx安全效能優化上部

Nginx——Ngine X,是一款自由的、開源的、高效能HTTP伺服器和反向代理伺服器;也是一個IMAP、POP3、SMTP代理伺服器;也就是說Nginx本身就可以託管網站(類似於Tomcat一樣),進行Http服務處理,也可以作為反向代理伺服器使用。 Nginx 解