什麼是 HTTP/2 ?

HTTP/2 在 RFC 7540 定稿,並且在 Nginx 已經被支援。 HTTP/2 是繼 1999 年 HTTP/1.1 發行後,歷時 16 年的新一代 HTTP 傳輸協定標準,以 Google 的 SPDY(網路內容傳輸的應用程式層協定)為基礎進行開發。而 Google 計畫於 2016年停止 SPDY 對 Chrome 的支援,全面採用 HTTP/2。

為什麼要升級 HTTP/2 ?

  • HTTP/2 可以無痛的向下相容,程式無需做太大修改。因為大部分的 API 及 headers 是一樣的,也因此目前多數主流瀏覽器皆已支援。
  • 不同於 HTTP/1.1 使用明文傳輸, HTTP/2 改用二進制並對 header 進行壓縮。因此,將不必再擔心 header 和 cookie 的大小。
  • HTTP/2 是全多工的,能夠達到一個連線下的平行使用。Domain sharding 和 asset concatenation 變成 anti-pattern。對於有大量 asset 的網站來說,能夠大幅降低傳輸時間。
  • 允許 Web Server 主動推送 Response 到 client 的 cache (但目前 Ngnix 不支持這個特性),例如:在接受請求前,就可以先發送 CSS 至 client,能夠加快網頁處理及資料更新。
  • 採用新的 ALPN extension ,能夠更快地加密連線,加密協定是在初始化連線時定義的。

開始設定

目前大部分的瀏覽器都已經可以支援 HTTP/2,包含 IE11 and Edge,除了手機上的 Opera Mini 及 Android Browser。以下設定在未支持 HTTP/2 客戶端時會自動改用 HTTP/1.1。因為,網站有可能被舊的瀏覽器訪問或 search engine bots 存取。

以下為用到的需求:

  1. SSL certificate
  2. Nginx 1.9.5 或更高版本。
  3. 可以使用 HTTP/2 indicatorHTTP/2 test 來檢查。

Step 1. 虛擬 SSL certificates & keys

如果需要生成虛擬 certificates 及 keys,可以使用下面的命令(後面的步驟將使用這組認證):

Terminal
1
2
3
4
# Generate all keys and cefiticates in /etc/ssl
$ openssl genrsa -out /etc/ssl/dummy.key 2048
$ openssl req -new -key /etc/ssl/dummy.key -out /etc/ssl/dummy.csr -subj "/C=GB/L=London/O=Company Ltd/CN=haproxy"
$ openssl x509 -req -days 3650 -in /etc/ssl/dummy.csr -signkey /etc/ssl/dummy.key -out /etc/ssl/dummy.crt
Terminal
1
2
# Concatenate certificate and key into .pem format, compatible with HAProxy
cat /etc/ssl/dummy.crt /etc/ssl/dummy.key > /etc/ssl/dummy.pem

Step 2. Nginx setup

利用 mainline YUM repository ,而不是穩定版的安裝 Nginx 1.9。將 yum repo 位置放在 /etc/yum.repos.d/nginx.repo,然後執行 yum install。

nginx.repo
1
2
3
4
5
[nginx]
name=nginx repo
baseurl=https://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1
Terminal
1
$ yum install -y nginx

Step 3. 虛擬主機設定

建立 Nginx vhost.conf(虛擬主機設定文件)確保在使用 HTTP/2 的情況下正常工作。下面是一個簡單的 vhost 配置:

vhost.conf
1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80 default_server;
listen 81 default_server http2 proxy_protocol;
## Needed when behind HAProxy with SSL termination + HTTP/2 support
listen 443 default_server ssl http2;

ssl_certificate /etc/ssl/dummy.crt;
ssl_certificate_key /etc/ssl/dummy.key;

root /data/www/default;
index index.html;
}
  • Line 3:listen 443 default_server ssl http2那一行。這就相當於你使用了HTTP/2。
  • Line 7, 8:使用在獲取SSL證書那一步生成的dummy.crt和dummy.key。

最後,當你使用 https:// 連接網站時,HTTP/2 indicator 會告訴你網站正在運行 HTTP/2。

結論

HTTP/2 大幅降低了網頁間的傳輸速度,因此過去常常依靠 CSS sprites 與 Assets 合併來優化頁面載入速度,變得不是那麼重要。此外 HTTP/2 的升級是很容易的,而大多數的瀏覽器都已經支援。

今天不升級,要等什麼時候呢?

Reference

[1] The complete guide to HTTP/2 with HAProxy and Nginx
[2] 在 nginx 中啟用 HTTP/2 並提高 HTTPS 安全性與效能
[3] Open Source NGINX 1.9.5 Released with HTTP/2 Support
[4] 了解 HTTP/2 的特色與 HTTP/1.1 的差異


License

本文主要參考 The complete guide to HTTP/2 with HAProxy and Nginx,如果侵犯到你的權益,請及時聯繫我們。


本著作由 Chang, Wei-Yaun (v123582) 製作,
創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。