HTTP/2 is the future of the Web, and it is here!html
使用 HTTP/1.1 和 HTTP/2 在相同環境各加載 300 多張小圖片,性能相差一倍。前端
你能夠點擊這裏的 DEMO 體驗一下,HTTP/2 的加載快感。nginx
超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯網上應用最爲普遍的一種網絡協議。設計 HTTP 最初的目的是爲了提供一種發佈和接收 HTML 頁面的方法。經過 HTTP 或者 HTTPS 協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。git
HTTP 的發展是由蒂姆·伯納斯-李於 1989 年在歐洲核子研究組織(CERN)所發起。由萬維網協會(World Wide Web Consortium,W3C)和互聯網工程任務組(Internet Engineering Task Force,IETF)制定標準,最終發佈了一系列的 RFC,其中最著名的是 1999 年 6 月公佈的 RFC 2616,定義了 HTTP 協議中現今普遍使用的一個版本——HTTP 1.1。github
2014 年 12 月,互聯網工程任務組(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工做小組將 HTTP/2 標準提議遞交至 IESG 進行討論 [1],於 2015 年 2 月 17 日被批准。[2] HTTP/2 標準於 2015 年 5 月以 RFC 7540 正式發表,替換 HTTP 1.1 成爲 HTTP 的實現標準。web
以上摘要自 維基百科。算法
SPDY(發音如英語:speedy)。實際上在 HTTP2 提出來以前,SPDY 流行了很長一段時間。該系列協議由谷歌開發,於 2009 年公開。它的設計目標是下降 50% 的頁面加載時間。當下不少著名的互聯網公司都在本身的網站或 APP 中採用了 SPDY 系列協議(當前最新版本是 SPDY/3.1),由於它對性能的提高是顯而易見的。主流的瀏覽器(谷歌、火狐、Opera)也都早已經支持 SPDY,它已經成爲了工業標準。HTTP Working-Group 最終決定以 SPDY/2 爲基礎,開發 HTTP/2。chrome
忽然在 Chrome 51 版本以後不支持 SPDY 了,Chrome 棄用了 SPDY,開始全面支持 HTTP2。數據庫
相比 HTTP/1.x,HTTP/2 在底層傳輸作了很大的改動和優化:瀏覽器
每一個服務器只用一個鏈接。HTTP/2 對每一個服務器只使用一個鏈接,而不是每一個文件一個鏈接。這樣,就省掉了屢次創建鏈接的時間,這個時間對 TLS 尤爲明顯,由於 TLS 鏈接費時間。
加速 TLS 交付。HTTP/2 只需一次耗時的 TLS 握手,而且經過一個鏈接上的多路利用實現最佳性能。HTTP/2 還會壓縮首部數據,省掉 HTTP/1.x 時代所需的一些優化工做,好比拼接文件,從而提升緩存利用率。
簡化 Web 應用。使用 HTTP/2 可讓 Web 開發者省不少事,由於不用再作那些針對 HTTP/1.x 的優化工做了。
適合內容混雜的頁面。HTTP/2 特別適合混合了 HTML、CSS、JavaScript、圖片和有限多媒體的傳統頁面。瀏覽器能夠優先安排那些重要的文件請求,讓頁面的關鍵部分先出現,快出現。
更安全。經過減小 TLS 的性能損失,可讓更多應用使用 TLS,從而讓用戶信息更安全。
在如下瀏覽器的版本都開始支持 HTTP2。
這就尷尬了!Android 4.4.4 也就是 Kitkat 版本如下都不支持 HTTP2,谷歌 2016 年 6 月份的數據顯示 該版本的用戶佔 31.6%。
不過好消息是,支持 HTTP/2 的 Web Server 基本都支持 HTTP/1.1。這樣,即便瀏覽器不支持 HTTP/2,雙方也能夠協商出可用的 HTTP 版本,沒有兼容性問題。
推薦一個瀏覽器插件HTTP/2 and SPDY indicator,藍色的小圖標亮起,就表示該網站使用了 HTTP/2 協議。
大公司已經走在了時代的前沿,咱們這些追隨者有什麼理由不跟上呢。
。。。還有不少
不過百度此次又沒有跟上,不信大家本身去看。
這裏是 一覽,主流的開發語言和應用服務器都已經支持了 HTTP/2。
咱們從 NGINX 開始,nginx 從 1.9.5 開始支持 HTTP/2。
openssl。建議全局安裝。
SSL/TLS。http2 嚴格要求使用 https,因此你得準備一個證書。固然也能夠在 let's encrypt 申請一個。
nginx 至少須要啓用 http_v2_module 和 http_ssl_module 這兩個模塊。先下載源碼,在安裝目錄執行
./configure --with-http_v2_module --with-http_ssl_module make&&make install
重定向全部的請求到 SSL/TLS
server { listen 80; location / { return 301 https://$host$request_uri; } }
開啓 HTTP/2
server { listen 443 ssl http2 default_server; ssl_certificate server.crt; ssl_certificate_key server.key; ... }
最後一步,重啓 nginx
nginx -s reload
爲了驗證 HTTP/2 是否開啓,你能夠安裝瀏覽器插件 HTTP/2 and SPDY indicator 進行查看。
須要指出的是 HTTP/2 的服務器都是向下兼容的 HTTP/1.1 的,升級了以後,你不須要擔憂,以前的老版本用戶怎麼辦。訪問方式以下圖,
客戶端使用指望的協議鏈接代理服務器,好比 TLS 或 HTTP/2,而後代理服務器再去鏈接應用服務器、數據庫服務器等,但不須要使用相同的協議。
LVS 有 4 層和 7 層協議負載。所謂四層就是基於 IP+端口的負載均衡;七層就是基於 URL 等應用層信息的負載均衡。研究過阿里雲的 SLB,暫時還不支持 HTTP/2 的支持,也沒有看到 AWS、IBM 有對應的服務支持。因此咱們能用的解決方案就是:
LVS 4 層 + HTTP/2 web Server
LVS 只作請求分發,由應用服務器來處理加密解密和 HTTP/2 的支持。這樣的方式,對性能影響有多少呢,須要實際的測試,不過目前來講,沒有其餘方案。
HTTP1.1 時代,咱們針對這個協議的特性作了不少 WEB 前端優化,好比說 域名分片、文件合併壓縮、雪碧圖、行內代碼等。可是到了 HTTP/2 時代,這些操做都是多餘的了,對於同一個域名,只會創建起一個 TCP 鏈接。太多的域名還會增長新建鏈接的初始化和 TLS 握手的時間。
在採用 HTTP/2 以前,須要找出應用了這些優化的代碼,分析一下它們會不會影響你的應用設計和工做流程。這樣在遷移到 HTTP/2 以後,就能夠着手改造它們,甚至撤銷某些優化
HTTPS 正式啓用以前還有不少問題要解決。
單鏈接開銷比較大。HPACK 數據壓縮算法會更新兩端的查找表。這樣可讓鏈接有狀態,而破壞狀態就意味着要重建查找表,另外單鏈接佔用內存較多
全站點 HTTPS 的改造。可能涉及到 web,CDN,native 客戶端。
須要拋棄針對 HTTP/1.x 的優化。
對下載大文件不利。
你的客戶也許不在意。你的客戶極可能不在意他分享的自家貓咪的視頻是否受到 TLS 和 HTTP/2 的保護。