Nginx学习之HTTP/2.0配置
哎呀,一不小心自己的博客也是HTTP/2.0了,前段時間對網(wǎng)站進行了https遷移并上了CDN,最終的結(jié)果是這醬紫的(重點小綠鎖,安全標(biāo)示以及HTTP/2.0請求)。
科普
隨著互聯(lián)網(wǎng)的快速發(fā)展,HTTP1.x協(xié)議得到了迅猛發(fā)展,但當(dāng)網(wǎng)站一個頁面包含了數(shù)幾十個請求時,HTTP1.x協(xié)議的局限性便暴露了出來:
- 每個請求與響應(yīng)需要單獨建立鏈路進行請求(Connection字段能夠解決部分問題),浪費資源。
- 每個請求與響應(yīng)都需要添加完整的頭信息,應(yīng)用數(shù)據(jù)傳輸效率較低。
- 默認(rèn)沒有進行加密,數(shù)據(jù)在傳輸過程中容易被監(jiān)聽與篡改。
HTTP/2 協(xié)議于 2015 年 5 月 14 日正式版發(fā)布。HTTP2正是為了解決HTTP1.x暴露出來的問題而誕生的。
說到HTTP2不得不提spdy。
由于HTTP1.x暴露出來的問題,Google設(shè)計了全新的名為spdy的新協(xié)議。spdy在五層協(xié)議棧的TCP層與HTTP層引入了一個新的邏輯層以提高效率。spdy是一個中間層,對TCP層與HTTP層有很好的兼容,不需要修改HTTP層即可改善應(yīng)用數(shù)據(jù)傳輸速度。
spdy通過多路復(fù)用技術(shù),使客戶端與服務(wù)器只需要保持一條鏈接即可并發(fā)多次數(shù)據(jù)交互,提高了通信效率。
而HTTP2便士基于spdy的思路開發(fā)的。
通過流與幀概念的引入,繼承了spdy的多路復(fù)用,并增加了一些實用特性。
HTTP2有什么特性呢?HTTP2的特性不僅解決了上述已暴露的問題,還有一些功能使HTTP協(xié)議更加好用。
多路復(fù)用
利用多路復(fù)用可以實現(xiàn)延遲削減。
每個 Frame Header 都有一個 Stream ID 就是被用于實現(xiàn)該特性。每次請求/響應(yīng)使用不同的 Stream ID。就像同一個 TCP 鏈接上的數(shù)據(jù)包通過 IP:PORT來區(qū)分出數(shù)據(jù)包去往哪里一樣。通過 Stream ID 標(biāo)識,所有的請求和響應(yīng)都可以歡快的同時跑在一條 TCP 鏈接上了。
當(dāng)流并發(fā)時,就會涉及到流的優(yōu)先級和依賴。優(yōu)先級高的流會被優(yōu)先發(fā)送。圖片請求的優(yōu)先級要低于 CSS 和 SCRIPT,這個設(shè)計可以確保重要的東西可以被優(yōu)先加載完。
直白的說就是所有的請求都是通過一個 TCP 連接并發(fā)完成。HTTP/1.x 雖然通過 pipeline 也能并發(fā)請求,但是多個請求之間的響應(yīng)會被阻塞的,所以 pipeline 至今也沒有被普及應(yīng)用,而 HTTP/2 做到了真正的并發(fā)請求,同時,流還支持優(yōu)先級和流量控制。
壓縮頭信息
HTTP/2 對消息頭采用 HPACK 進行壓縮傳輸,能夠節(jié)省消息頭占用的網(wǎng)絡(luò)的流量。而 HTTP/1.x 每次請求,都會攜帶大量冗余頭信息,浪費了很多帶寬資源。頭壓縮能夠很好的解決該問題。
二進制格式傳輸數(shù)據(jù)
HTTP/2 采用二進制格式傳輸數(shù)據(jù)。二進制格式在協(xié)議的解析和優(yōu)化擴展上帶來更多的優(yōu)勢和可能。
支持服務(wù)端Push消息到客戶端
當(dāng)服務(wù)端需要主動推送某個資源時,便會發(fā)送一個 Frame Type 為 PUSH_PROMISE 的 Frame,里面帶了 PUSH 需要新建的 Stream ID。意思是告訴客戶端:接下來我要用這個 ID 向你發(fā)送東西,客戶端準(zhǔn)備好接著??蛻舳私馕?Frame 時,發(fā)現(xiàn)它是一個 PUSH_PROMISE 類型,便會準(zhǔn)備接收服務(wù)端要推送的流。
這使得服務(wù)端能夠更快的把資源推送給客戶端。例如服務(wù)端可以主動把 JS 和 CSS 文件推送給客戶端,而不需要客戶端解析 HTML 再發(fā)送這些請求。當(dāng)客戶端需要的時候,它已經(jīng)在客戶端了。
此外需要注意的是,HTTP2目前在實際使用中,只用于HTTPS協(xié)議場景下,通過握手階段ClientHello與ServerHello的extension字段協(xié)商而來,所以目前HTTP2的使用場景,都是默認(rèn)安全加密的。
Nginx 啟用 HTTP/2 支持
注意事項
linux下檢查openssl version 版本,目前的版本是1.0.1e,如果http2 不生效可能是openssl版本的問題。
Nginx是在1.9.5之后支持HTTP/2的,低版本的請先升級。
新增HTTP/2模塊
由于之前安裝的Nginx沒有配置http_v2_module,所有要重新編譯一下,記住不要執(zhí)行安裝操作。
切換到Nginx源碼目錄執(zhí)行以下操作,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然后執(zhí)行編譯
make執(zhí)行成功以后,會在源碼目錄下生成一個objs文件夾,把里面的Nginx復(fù)制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;.....省略 }驗證網(wǎng)站對 HTTP/2 的支持
方法一:瀏覽網(wǎng)站 同時瀏覽器訪問驗證網(wǎng)站對 HTTP/2 的支持,如果你的網(wǎng)站也出現(xiàn)在這里說明配置成功。
方法二:在線測試地址:https://www.ssllabs.com/ssltest/
認(rèn)證級別A
方法三:谷歌瀏覽器下載HTTP/2 and SPDY indicator插件,安裝成功后,瀏覽開啟Http2的網(wǎng)站,右上角會顯示藍色的閃電。
疑惑
其實網(wǎng)站之前沒有配置HTTP/2.0的時候已經(jīng)是小藍閃電了,難道是因為啟用了CDN?
在配置HTTP/2.0之后,盡管火狐瀏覽器網(wǎng)絡(luò)請求都是HTTP/2.0,但是后臺日志(都是動態(tài)請求),卻是HTTP/1.1?
CDN使用的是阿里云的服務(wù),可能阿里的CDN早已實現(xiàn)HTTP/2.0技術(shù)了。
轉(zhuǎn)載于:https://www.cnblogs.com/smallSevens/p/7472188.html
總結(jié)
以上是生活随笔為你收集整理的Nginx学习之HTTP/2.0配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#显示百度地图API
- 下一篇: Django框架之跨站请求伪造