如何在 Ubuntu 20.04 上設(shè)置支持 HTTP/2 的 Nginx
介紹
Nginx是一個快速可靠的開源 Web 服務(wù)器。它因其低內(nèi)存占用、高可擴(kuò)展性、易于配置以及對多種協(xié)議的支持而廣受歡迎。
HTTP/2 是超文本傳輸協(xié)議的較新版本,用于在 Web 上將頁面從服務(wù)器傳送到瀏覽器。HTTP/2 是近二十年來 HTTP 的第一次重大更新:HTTP1.1 早在 1999 年就被引入公眾,當(dāng)時網(wǎng)頁的大小要小得多。從那時起,互聯(lián)網(wǎng)發(fā)生了巨大的變化,我們現(xiàn)在面臨著 HTTP 1.1 的限制。該協(xié)議限制了大多數(shù)現(xiàn)代網(wǎng)站的潛在傳輸速度,因?yàn)樗陉?duì)列中下載頁面的一部分——前一部分必須在下一部分開始下載之前完全下載——而一個普通的現(xiàn)代網(wǎng)頁會下載數(shù)十個單獨(dú)的 CSS、JavaScript、和圖像資產(chǎn)。
HTTP/2 解決了這個問題,因?yàn)樗鼛砹艘恍└拘缘淖兓?/p>
- 所有請求都是并行下載的,而不是在隊(duì)列中
- HTTP 標(biāo)頭被壓縮
- 頁面作為二進(jìn)制文件傳輸,而不是作為文本文件傳輸,這樣效率更高
- 服務(wù)器可以在沒有用戶請求的情況下“推送”數(shù)據(jù),為高延遲用戶提高速度
盡管 HTTP/2 不需要加密,但兩個最流行的瀏覽器 Google Chrome 和 Mozilla Firefox 的開發(fā)人員表示,出于安全原因,他們將僅支持 HTTP/2 用于 HTTPS 連接。因此,如果您決定設(shè)置支持 HTTP/2 的服務(wù)器,您還必須使用 HTTPS 保護(hù)它們。
本教程將幫助您設(shè)置一個支持 HTTP/2 的快速且安全的 Nginx 服務(wù)器。
先決條件
在開始之前,您需要準(zhǔn)備一些東西:
- 設(shè)置的 Ubuntu 20.04 服務(wù)器,包括 sudo 非 root 用戶和防火墻。
- Nginx 安裝在您的服務(wù)器上,您可以按照如何在 Ubuntu 20.04 上安裝 Nginx 來完成。
- 配置為指向您的服務(wù)器的域名。
- 為您的服務(wù)器配置的 TLS/SSL 證書。您有幾個選擇:
- 您可以按照如何在 Ubuntu 20.04 上使用 Let's Encrypt 保護(hù) Nginx 來從Let's Encrypt獲得免費(fèi)證書。
- 您還可以按照如何在 Ubuntu 20.04 中為 Nginx 創(chuàng)建自簽名 SSL 證書來生成和配置自簽名證書。
- Nginx 配置為將流量從端口重定向80到端口443,這應(yīng)該包含在前面的先決條件中。
- Nginx 配置為使用 2048 位或更高的 Ephemeral Diffie-Hellman (DHE) 密鑰,這也應(yīng)包含在先前的先決條件中。
步驟 1 — 啟用 HTTP/2 支持
如果您按照Nginx 安裝教程中的服務(wù)器塊設(shè)置步驟進(jìn)行操作,則您的域中應(yīng)該有一個服務(wù)器塊,并且已正確設(shè)置了指令。我們將進(jìn)行的第一個更改是修改您域的服務(wù)器塊以使用 HTTP/2。/etc/nginx/sites-available/your_domainserver_name
使用nano或首選編輯器打開您的域的配置文件:
- sudo nano /etc/nginx/sites-enabled/your_domain
在文件中,找到listen與 port 關(guān)聯(lián)的變量443:
/etc/nginx/sites-enabled/your_domain
- ...
- listen [::]:443 ssl ipv6only=on;
- listen 443 ssl;
- ...
第一個用于 IPv6 連接。第二個用于所有 IPv4 連接。我們將為兩者啟用 HTTP/2。
修改每個listen指令以包括http2:
/etc/nginx/sites-enabled/your_domain
- ...
- listen [::]:443 ssl http2 ipv6only=on;
- listen 443 ssl http2;
- ...
這告訴 Nginx 在支持的瀏覽器中使用 HTTP/2。
保存配置文件并退出文本編輯器。如果您使用的是,請?jiān)诔霈F(xiàn)提示時nano按Ctrl+Xthen,Y然后按 Enter。
每當(dāng)您對 Nginx 配置文件進(jìn)行更改時,您都應(yīng)該使用-t運(yùn)行 Nginx 內(nèi)置語法檢查命令的標(biāo)志來檢查配置是否存在錯誤:
- sudo nginx -t
如果語法沒有錯誤,您將收到如下輸出:
sudo nginx -t 的輸出
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
接下來,您將配置 Nginx 服務(wù)器以使用更嚴(yán)格的密碼列表來提高服務(wù)器的安全性。
步驟 2 — 刪除舊的和不安全的密碼套件
HTTP/2 有一個應(yīng)該避免的舊的和不安全的密碼的阻止列表。密碼套件是描述傳輸數(shù)據(jù)應(yīng)如何加密的加密算法。
您將用于定義密碼的方法取決于您為 Nginx 配置 TLS/SSL 證書的方式。
如果您使用 Certbot 獲取證書,它還會創(chuàng)建/etc/letsencrypt/options-ssl-nginx.conf包含對 HTTP/2 不夠安全的密碼的文件。但是,修改此文件將阻止 Certbot 將來應(yīng)用更新,因此我們只會告訴 Nginx 不要使用此文件,我們將指定我們自己的密碼列表。
打開您的域的服務(wù)器塊配置文件:
- sudo nano /etc/nginx/sites-enabled/your_domain
找到包含該options-ssl-nginx.conf文件的行并通過#在該行的開頭添加一個字符來將其注釋掉:
/etc/nginx/sites-enabled/your_domain
- # include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot<^>
在該行下方,添加此行以定義允許的密碼:
/etc/nginx/sites-enabled/your_domain
- ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
保存文件并退出編輯器。
如果您使用自簽名證書或使用第三方證書并根據(jù)先決條件對其進(jìn)行配置,請/etc/nginx/snippets/ssl-params.conf在文本編輯器中打開該文件:
- sudo nano /etc/nginx/snippets/ssl-params.conf
找到以下行:
/etc/nginx/snippets/ssl-params.conf
- ...
- ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
- ...
修改它以使用以下密碼列表:
/etc/nginx/snippets/ssl-params.conf
- ...
- ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
保存文件并退出編輯器。
再次使用以下nginx -t命令檢查配置是否存在語法錯誤:
- sudo nginx -t
如果您遇到任何錯誤,請解決它們并再次測試。
一旦您的配置通過語法檢查,請使用以下systemctl命令重新啟動 Nginx :
- sudo systemctl reload nginx.service
重新啟動服務(wù)器后,讓我們驗(yàn)證它是否有效。
步驟 3 — 驗(yàn)證 HTTP/2 是否已啟用
讓我們確保服務(wù)器正在運(yùn)行并使用 HTTP/2。
使用該curl命令向您的站點(diǎn)發(fā)出請求并查看標(biāo)頭:
- curl -I -L --http2 https://your_domain
您將收到如下輸出:
- HTTP/2 200
- server: nginx/1.18.0 (Ubuntu)
- date: Wed, 10 Nov 2021 17:53:10 GMT
- content-type: text/html
- content-length: 612
- last-modified: Tue, 09 Nov 2021 23:18:37 GMT
- etag: "618b01cd-264"
- accept-ranges: bytes
您還可以驗(yàn)證 HTTP/2 是否在 Google Chrome 中使用。打開 Chrome 并導(dǎo)航到. 打開 Chrome 開發(fā)人員工具(查看->開發(fā)人員->開發(fā)人員工具)并重新加載頁面(查看->重新加載此頁面)。導(dǎo)航到Network選項(xiàng)卡,右鍵單擊以Name開頭的表標(biāo)題行,然后從彈出菜單中選擇Protocol選項(xiàng)。https://your_domain
您將擁有一個包含(代表 HTTP/2)的新協(xié)議列h2,表明 HTTP/2 正在運(yùn)行。
此時,您已準(zhǔn)備好通過 HTTP/2 協(xié)議提供內(nèi)容。讓我們通過啟用 HSTS 來提高安全性和性能。
步驟 4 - 啟用 HTTP 嚴(yán)格傳輸安全 (HSTS)
即使您的 HTTP 請求重定向到 HTTPS,您也可以啟用HTTP 嚴(yán)格傳輸安全(HSTS) 以避免必須執(zhí)行這些重定向。如果瀏覽器找到 HSTS 標(biāo)頭,它不會在給定的時間段內(nèi)再次嘗試通過常規(guī) HTTP 連接到服務(wù)器。無論如何,它將僅使用加密的 HTTPS 連接來交換數(shù)據(jù)。此標(biāo)頭還保護(hù)我們免受協(xié)議降級攻擊。
再次打開您的域的服務(wù)器塊配置文件:
- sudo nano /etc/nginx/your_domain
將此行添加到包含 SSL 密碼的文件的同一塊以啟用 HSTS:
/etc/nginx/your_domain
- server {
- ...
- ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
- add_header Strict-Transport-Security "max-age=15768000" always;
- }
- ...
在max-age以秒為單位設(shè)定。該值15768000相當(dāng)于 6 個月。
默認(rèn)情況下,此標(biāo)頭不會添加到子域請求中。如果您有子域并希望 HSTS 應(yīng)用于所有子域,則應(yīng)includeSubDomains在行尾添加變量,如下所示:
/etc/nginx/your_domain
- add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;
保存文件,然后退出編輯器。
再次檢查配置是否有語法錯誤:
- sudo nginx -t
最后,重新啟動 Nginx 服務(wù)器以應(yīng)用更改。
sudo systemctl reload nginx.service
結(jié)論
您的 Nginx 服務(wù)器現(xiàn)在正在為 HTTP/2 頁面提供服務(wù)。如果您想測試 SSL 連接的強(qiáng)度,請?jiān)L問Qualys SSL 實(shí)驗(yàn)室并針對您的服務(wù)器運(yùn)行測試。如果一切配置正確,您應(yīng)該獲得 A+ 標(biāo)記以確保安全。