我已经为一些网站使用了 Varnish Cache。但是,我需要一些实施 HTTPS 的建议。我愿意接受 Varnish Cache 的替代方案。Varnish 的配置相对复杂,所以也许不太先进的替代方案更适合我的网站。
Cloudflare 看起来是个可行的选择,但据我所知,它需要每月 200 美元起的商业计划。我可能错了。
有什么建议吗?
答案1
在 Varnish 上使用 HTTPS 并不难。尽管 Varnish 本身不提供 TLS,但它有助于终止 TLS。
2015 年 Varnish 发布拴住,一个非常强大的 TLS 代理,可处理终止 TLS 并将未加密的 HTTP 流量转发到 Varnish。
安装挂钩
你可以从 Hitch 网站下载源代码并在我们的服务器上编译它。如果您想使用软件包安装 Hitch,您可以在Debian 或 Ubuntu:
apt-get install -y hitch
配置 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 运行时配置可能包含以下监听信息:
varnish -a :80
这意味着 Varnish 正在监听端口 80 上的连接。为了确保 HTTPS 正常工作,我们将添加另一个监听端口,但需要特定的配置:
varnish -a :80 -a :8443,PROXY
确保在更改运行时设置后重新加载 Varnish。
您会注意到端口8843
现在也分配给了 Varnish。它不用于标准 HTTP,而是用于使用PROXY 协议. Hitch 中还启用了 PROXY 协议支持。
这样可以确保原始客户端 IP 地址被传递给 Varnish,无论它必须经过多少额外的跳数。原始客户端 IP 地址将由X-Forwarded-For
Varnish 自动存储在标头中。
端口处理的流量类型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 需要有一个缓存变化按照协议。你可以通过返回以下内容轻松指示 Varnish 执行此操作HTTP 响应标头在您的后端应用程序中:
Vary: X-Forwarded-Proto
如果由于某种原因这不可能,您也可以vcl_hash
在 VCL 代码中扩展逻辑。在这种情况下,请添加以下代码片段:
sub vcl_hash {
hash_data(req.http.X-Forwarded-Proto);
}