程式員也有春天之HTTP/2.0配置

来源:http://www.cnblogs.com/smallSevens/archive/2017/09/08/7492784.html
-Advertisement-
Play Games

哎呀,一不小心自己的博客也是HTTP/2.0了,前段時間對網站進行了https遷移並上了CDN,最終的結果是這醬紫的(重點小綠鎖,安全標示以及HTTP/2.0請求)。 科普 隨著互聯網的快速發展,HTTP1.x協議得到了迅猛發展,但當網站一個頁麵包含了數幾十個請求時,HTTP1.x協議的局限性便暴露 ...


哎呀,一不小心自己的博客也是HTTP/2.0了,前段時間對網站進行了https遷移並上了CDN,最終的結果是這醬紫的(重點小綠鎖,安全標示以及HTTP/2.0請求)。

1.png

科普

隨著互聯網的快速發展,HTTP1.x協議得到了迅猛發展,但當網站一個頁麵包含了數幾十個請求時,HTTP1.x協議的局限性便暴露了出來:

  • 每個請求與響應需要單獨建立鏈路進行請求(Connection欄位能夠解決部分問題),浪費資源。
  • 每個請求與響應都需要添加完整的頭信息,應用數據傳輸效率較低。
  • 預設沒有進行加密,數據在傳輸過程中容易被監聽與篡改。

HTTP/2 協議於 2015 年 5 月 14 日正式版發佈。HTTP2正是為瞭解決HTTP1.x暴露出來的問題而誕生的。

說到HTTP2不得不提spdy。
由於HTTP1.x暴露出來的問題,Google設計了全新的名為spdy的新協議。spdy在五層協議棧的TCP層與HTTP層引入了一個新的邏輯層以提高效率。spdy是一個中間層,對TCP層與HTTP層有很好的相容,不需要修改HTTP層即可改善應用數據傳輸速度。
spdy通過多路復用技術,使客戶端與伺服器只需要保持一條鏈接即可併發多次數據交互,提高了通信效率。
而HTTP2便士基於spdy的思路開發的。
通過流與幀概念的引入,繼承了spdy的多路復用,並增加了一些實用特性。

HTTP2有什麼特性呢?HTTP2的特性不僅解決了上述已暴露的問題,還有一些功能使HTTP協議更加好用。

多路復用

利用多路復用可以實現延遲削減。
每個 Frame Header 都有一個 Stream ID 就是被用於實現該特性。每次請求/響應使用不同的 Stream ID。就像同一個 TCP 鏈接上的數據包通過 IP:PORT來區分出數據包去往哪裡一樣。通過 Stream ID 標識,所有的請求和響應都可以歡快的同時跑在一條 TCP 鏈接上了。
當流併發時,就會涉及到流的優先順序和依賴。優先順序高的流會被優先發送。圖片請求的優先順序要低於 CSS 和 SCRIPT,這個設計可以確保重要的東西可以被優先載入完。
直白的說就是所有的請求都是通過一個 TCP 連接併發完成。HTTP/1.x 雖然通過 pipeline 也能併發請求,但是多個請求之間的響應會被阻塞的,所以 pipeline 至今也沒有被普及應用,而 HTTP/2 做到了真正的併發請求,同時,流還支持優先順序和流量控制。

壓縮頭信息

HTTP/2 對消息頭採用 HPACK 進行壓縮傳輸,能夠節省消息頭占用的網路的流量。而 HTTP/1.x 每次請求,都會攜帶大量冗餘頭信息,浪費了很多帶寬資源。頭壓縮能夠很好的解決該問題。

二進位格式傳輸數據

HTTP/2 採用二進位格式傳輸數據。二進位格式在協議的解析和優化擴展上帶來更多的優勢和可能。

支持服務端Push消息到客戶端

當服務端需要主動推送某個資源時,便會發送一個 Frame Type 為 PUSH_PROMISE 的 Frame,裡面帶了 PUSH 需要新建的 Stream ID。意思是告訴客戶端:接下來我要用這個 ID 向你發送東西,客戶端準備好接著。客戶端解析 Frame 時,發現它是一個 PUSH_PROMISE 類型,便會準備接收服務端要推送的流。
這使得服務端能夠更快的把資源推送給客戶端。例如服務端可以主動把 JS 和 CSS 文件推送給客戶端,而不需要客戶端解析 HTML 再發送這些請求。當客戶端需要的時候,它已經在客戶端了。

此外需要註意的是,HTTP2目前在實際使用中,只用於HTTPS協議場景下,通過握手階段ClientHello與ServerHello的extension欄位協商而來,所以目前HTTP2的使用場景,都是預設安全加密的。

Nginx 啟用 HTTP/2 支持

註意事項

linux下檢查openssl version 版本,目前的版本是1.0.1e,如果http2 不生效可能是openssl版本的問題。

Nginx是在1.9.5之後支持HTTP/2的,低版本的請先升級。

新增HTTP/2模塊

由於之前安裝的Nginx沒有配置http_v2_module,所有要重新編譯一下,記住不要執行安裝操作。

切換到Nginx源碼目錄執行以下操作,pcre和zlib是博主自己的安裝目錄。

./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module  --with-http_v2_module  --with-pcre=/home/tools/pcre-8.00 --with-zlib=/home/tools/zlib-1.2.11 

然後執行編譯

make

執行成功以後,會在源碼目錄下生成一個objs文件夾,把裡面的Nginx複製Nginx到指定安裝目錄。

cp /home/tools/nginx-1.10.3/objs/nginx  /usr/local/nginx

重啟Nginx

nginx -s reload 

檢查是否安裝成功,成功後配置中會存在 with-http_v2_module

nginx -V

最後你只需要在配置中增加

server {

 listen 443 ssl http2;

 .....省略
}

驗證網站對 HTTP/2 的支持

方法一:瀏覽網站 同時瀏覽器訪問驗證網站對 HTTP/2 的支持,如果你的網站也出現在這裡說明配置成功。

2.png

方法二:線上測試地址:https://www.ssllabs.com/ssltest/

認證級別A

3.png

方法三:谷歌瀏覽器下載HTTP/2 and SPDY indicator插件,安裝成功後,瀏覽開啟Http2的網站,右上角會顯示藍色的閃電。

4.png

疑惑

其實網站之前沒有配置HTTP/2.0的時候已經是小藍閃電了,難道是因為啟用了CDN?

在配置HTTP/2.0之後,儘管火狐瀏覽器網路請求都是HTTP/2.0,但是後臺日誌(都是動態請求),卻是HTTP/1.1?

CDN使用的是阿裡雲的服務,可能阿裡的CDN早已實現HTTP/2.0技術了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • media 靜態文件配置 static 靜態文件多用於存放用於渲染前端頁面的相關數據,media用於存放客戶上傳或其他的文件 setting.py 中加入路徑 urls.py 中加入路由分配: 這樣上傳在django的文件都可以在前端調用: 全局變數: 將全局變數存入setting.py,如 FUN ...
  • 之前,調用第3方服務,每個方法都差不多“長”這樣, 寫起來啰嗦, 改起來麻煩, 還容易改漏。 我經過學習和提取封裝, 將try ... catch ... catch .. 提取為公用, 得到這2個方法: 現在用起來是如此簡潔。像這種無返回值的: 還有這種有返回值的: 這是我的第一篇Java文章。學 ...
  • Azure 提供了豐富的 Python SDK 來對 Azure 進行開發管理,包括使用 Azure 的開源框架在 Azure 上創建 web 應用程式,對 Azure 的虛擬機,存儲等進行管理,本系列會簡單介紹如何在 ASM 和 ARM 模式下對 Azure 進行管理。 1. 首先我們需要配置基本 ...
  • Azure 作為微軟的公有雲平臺,提供了非常豐富的 SDK 和 API 讓開發人員可以非常方便的調用的各項服務,目前除了自家的 .NET、Java、Python、 nodeJS、Ruby,PHP 等語言都提供支持,詳細的文檔說明請參考: https://azure.microsoft.com/en- ...
  • Visual Stdio 下編譯 C 文件時出現的: warning C4819: 該文件包含不能在當前代碼頁(936)中表示的字元。請將該文件保存為 Unicode 格式以防止數據丟失 解決方案: 打開【文件】->【高級保存選項】,設置合適的編碼,我這裡選擇了“Unicode (UTF-8 帶簽名 ...
  • if條件判斷語句: 1: if後面的是條件(註:這裡跟java不一樣,條件不需要加()) 如果條件成立,會返回一個(True),就會執行下麵的語句。 條件不成立,執行else裡面的語句。(註:代碼縮進) 迴圈語句: 2:while 判斷條件可以是任何表達式,任何非零,非空的值均為True.判斷條件F ...
  • 說起日誌,大家都是耳熟能詳的,一大堆日誌插件映入眼帘,日誌收集的方式也歷歷在目,但是,今天我們的重點不僅僅是收集日誌了,今天我們主要說說怎麼管理日誌 收集日誌 日誌管理的第一件事,就是日誌的收集。日誌收集是開發者必備的技巧,不管是哪個開發語言,哪個開發平臺,日誌收集的插件都是有很多選擇的。例如: . ...
  • 為了發送一個請求,您的代碼需要知道服務實例的網路位置(IP 地址與埠)。在運行於物理硬體上的傳統應用中,服務實例的網路位置是相對靜態的。例如,您的代碼可以從偶爾更新的配置文件中讀取網路位置。服務實例具有動態分配的網路位置。此外,由於自動擴展、故障與升級,整組服務實例會動態變更。因此,您的客戶端代碼... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...