Reverse-Proxy

使用 SSL 進行 Web 記憶體的建議/建議

  • July 1, 2021

我一直在為幾個網站使用 Varnish Cache。但是,我需要有關實施 HTTPS 的建議。我對 Varnish Cache 的替代品持開放態度。Varnish 的配置相對複雜,所以也許一個不太先進的替代方案更適合我的網站。

Cloudflare 看起來是一個可行的選擇,但據我所見,需要一個每月 200 美元起的商業計劃。我可能弄錯了。

有什麼建議嗎?

在 Varnish 上使用 HTTPS 並不難。儘管 Varnish 本身並不提供 TLS,但它有助於 TLS 終止。

2015 年,Varnish 發布了Hitch,這是一個非常強大的 TLS 代理,可以處理終止 TLS 並將未加密的 HTTP 流量轉發到 Varnish。

安裝掛鉤

您可以從 Hitch 網站下載原始碼並在我們的伺服器上進行編譯。如果您想使用軟體包安裝 Hitch,您可以在Debian 或 Ubuntu上執行以下命令:

apt-get install -y hitch

配置掛鉤

安裝 Hitch 後,打開/etc/hitch/hitch.conf並確保使用以下配置:

frontend = {
   host = "*"
   port = "443"
}

backend = "[localhost]:8443"

write-proxy-protocol-v2 = on

pem-file = "/etc/hitch/certs/example.com"

ciphersuites = "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256"

ciphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"

tls-protos = TLSv1.2 TLSv1.3

ecdh-curve = "X25519:prime256v1:secp384r1"

prefer-server-ciphers = false

請將您的證書放入/etc/hitch/certs並調整 中的pem-file指令hitch.conf

重新配置清漆

您的 Varnish 執行時配置可能包含以下監聽資訊:

varnish -a :80

這意味著 Varnish 正在偵聽埠 80 上的連接。為了確保 HTTPS 正常工作,我們將添加另一個偵聽埠,但具有特定配置:

varnish -a :80 -a :8443,PROXY

確保在更改執行時設置後重新載入 Varnish。

您會注意到埠8843現在也分配給了 Varnish。它不用於標準 HTTP,而是用於使用PROXY 協議的 HTTP 。Hitch 中還啟用了 PROXY 協議支持。

這樣可以確保將原始客戶端 IP 地址傳遞給 Varnish,而不管它必須經過多少額外的躍點。X-Forwarded-ForVarnish會自動將原始客戶端 IP 地址儲存在標頭中。

埠處理的流量類型是8443源自 Hitch 的 HTTP 流量,實際上是終止的 HTTPS 流量。

辨識 HTTPS 請求

Hitch 是一個 TLS 代理,它不理解 HTTP。這意味著它不能設置正常X-Forwarded-Proto標頭來指示終止了哪種流量。幸運的是,我們可以跟踪使用了哪個埠。

下面的 VCL 程式碼檢測 HTTP/HTTPS 請求並分配正確的X-Forwarded-Proto標頭。

vcl 4.0;
import std;
sub vcl_recv {
   if (std.port(local.ip) == 8443) {
       set req.http.X-Forwarded-Proto = "https";
   } else {
       set req.http.X-Forwarded-Proto = "http";
   }
}

許多框架和 CMS 系統利用X-Forwarded-Proto標頭自動建構正確的 URL 方案。我們在 VCL 中設置此標頭這一事實非常有幫助。

基於協議的記憶體變體

記憶體儲存 HTTP 響應,而不是 HTTP 請求。因此,當一個對象儲存在記憶體中時,Varnish 不知道它是來自 HTTP 還是 HTTPS URL。如果我們在沒有額外措施的情況下開始記憶體它們,如果 Varnish 開始記憶體對象的 HTTP 版本,您最終可能會陷入無限重定向循環。

為了避免這種情況,Varnish 需要每個協議都有一個記憶體變化。您可以通過在後端應用程序中返回以下HTTP 響應標頭輕鬆地指示 Varnish 這樣做:

Vary: X-Forwarded-Proto

如果由於某種原因這是不可能的,您還可以vcl_hash在您的 VCL 程式碼中擴展邏輯。在這種情況下,請添加以下程式碼段:

sub vcl_hash {
 hash_data(req.http.X-Forwarded-Proto);
}

引用自:https://serverfault.com/questions/1006660