使用 SSL 進行 Web 記憶體的建議/建議
我一直在為幾個網站使用 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-For
Varnish會自動將原始客戶端 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); }