早些時候,我們發布了支持 HTTP/2 協議的 NGINX Plus R7。作為 HTTP 協議的最新標准,HTTP/2 的設計為現在的 web 應用程序帶來了更高的性能和安全性。(LCTT 譯注: 開源版本的 NGINX 1.95 也支持 HTTP/2 了。)
NGINX Plus 所實現的 HTTP/2 協議可與現有的網站和應用程序進行無縫銜接。只需要一點改變,不管用戶選擇什麼樣的浏覽器,NGINX Plus 都能為用戶同時提供 HTTP/1.x 與HTTP/2 的最佳體驗。
要支持 HTTP/2 僅需通過可選的 nginx‑plus‑http2 軟件包。nginx‑plus 和 nginx‑plus‑extras 軟件包支持 SPDY 協議,目前推薦用於生產站點,因為其被大多數浏覽器所支持並且代碼也是相當成熟了。
HTTP/2 使數據傳輸更高效,對你的應用程序更安全。 HTTP/2 相比於 HTTP/1.x 有五個提高性能特點:
完全復用 – 在一個保持激活(keepalive)的連接上,HTTP/1.1 強制按嚴格的順序來處理請求。一個請求必須在下一個請求開始前結束。 HTTP/2 消除了這一要求,允許並行和亂序來處理請求。
單一,持久連接 – 由於 HTTP/2 允許請求完全復用,所以可以通過單一連接並行下載網頁上的所有對象。在 HTTP/1.x 中,使用多個連接來並行下載資源,從而導致使用底層 TCP 協議效率很低。
二進制編碼 – Header 信息使用緊湊的二進制格式發送,而不是純文本格式,節省了傳輸字節。
Header 壓縮 – Headers 使用專用的 HPACK 壓縮算法來進行壓縮,這進一步降低數據通過網絡傳輸的字節。
SSL/TLS 加密 – 在 HTTP/2 中,強制使用 SSL/TLS。在 RFC 中並沒有強制,其允許純文本的 HTTP/2,但是當前所有實現 HTTP/2的 Web 浏覽器都只支持加密。 SSL/TLS 可以使你的網站更安全,並且使用 HTTP/2 各項性能會有提升,加密和解密過程的性能損失就減少了。
要了解更多關於 HTTP/2:
我們的 HTTP/2 實現是基於 SPDY 支持的,它已經被廣泛部署(使用了 NGINX 或 NGINX Plus 的網站近 75% 都使用了 SPDY)。使用 NGINX Plus 部署 HTTP/2 時,幾乎不會改變你應用程序的配置。本節將討論 NGINX Plus如何實現對 HTTP/2 的支持。
NGINX Plus 作為一個 HTTP/2 網關。它與支持 HTTP/2 的客戶端 Web 浏覽器用 HTTP/2 通訊,而轉換 HTTP/2 請求給後端服務器通信時使用 HTTP/1.x(或者 FastCGI, SCGI, uWSGI, 等等. – 取決於你目前正在使用的協議)。
在一段時間內,你需要同時支持 HTTP/2 和 HTTP/1.x。在撰寫本文時,超過50%的用戶使用的 Web 浏覽器已經支持 HTTP/2,但這也意味著近50%的人還沒有使用。
為了同時支持 HTTP/1.x 和 HTTP/2,NGINX Plus 實現了 TLS 上的 Next Protocol Negotiation (NPN)擴展。當 Web 浏覽器連接到服務器時,其將所支持的協議列表發送到服務器端。如果浏覽器支持的協議列表中包括 h2 - 即 HTTP/2,NGINX Plus 將使用 HTTP/2 連接到浏覽器。如果浏覽器不支持 NPN 或在發送支持的協議列表中沒有 h2,NGINX Plus 將繼續回落到 HTTP/1.x。
NGINX 公司會盡可能幫助大家無縫過渡到使用 HTTP/2。本節介紹了通過對你應用進行改變來啟用對 HTTP/2 支持,其中只需對 NGINX Plus 配置進行幾個變化。
使用 nginx‑plus‑http2 軟件包升級到 NGINX Plus R7。注意現在還沒有支持 HTTP/2 版本的 nginx‑plus‑extras 軟件包。
如果你的應用尚未使用 SSL/TLS 加密,現在啟用它正是一個好的時機。加密你的應用程序可以保護你免受間諜以及來自其他中間人的攻擊。一些搜索引擎甚至在搜索結果中對加密站點提高排名。下面的配置塊重定向所有的普通 HTTP 請求到該網站的加密版本。
server { listen 80; location / { return 301 https://$host$request_uri; } }
要啟用對 HTTP/2 的支持,只需將 http2 參數添加到所有的 listen 指令中,也要包括 SSL 參數,因為浏覽器不支持不加密的 HTTP/2 請求。
server { listen 443 ssl http2 default_server; ssl_certificate server.crt; ssl_certificate_key server.key; … }
如果有必要,重啟 NGINX Plus,例如通過運行 nginx -s reload
命令。要驗證 HTTP/2 是否正常工作,你可以在 Google Chrome 和 Firefox 中使用 “HTTP/2 and SPDY indicator” 插件來檢查。
在安裝 nginx‑plus‑http2 包之前, 你必須刪除配置文件中所有 listen 指令後的 SPDY 參數(使用 http2 和 ssl 參數來替換它以啟用對 HTTP/2 的支持)。使用這個包後,如果 listen 指令後有 spdy 參數,NGINX Plus 將無法啟動。
如果你在 NGINX Plus 前端使用了 Web 應用防火牆(WAF),請確保它能夠解析 HTTP/2,或者把它移到 NGINX Plus 後面。
此版本不支持在 HTTP/2 RFC 中定義的 “Server Push” 特性。 NGINX Plus 以後的版本可能會支持它。
NGINX Plus R7 同時支持 SPDY 和 HTTP/2(LCTT 譯注:但是你只能同時使用其中一種)。在以後的版本中,我們將棄用對 SPDY 的支持。谷歌在2016年初將 棄用 SPDY,因此同時支持這兩種協議也非必要。
如果 sslpreferserver_ciphers 設置為 on 或者使用了定義在 Appendix A: TLS 1.2 Ciper Suite Black List 中的 ssl_ciphers 列表時,浏覽器會出現 handshake-errors 而無法正常工作。詳細內容請參閱 section 9.2.2 of the HTTP/2 RFC。