安装挂钩

安装挂钩

我已经为一些网站使用了 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-ForVarnish 自动存储在标头中。

端口处理的流量类型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);
}

相关内容