Stunnel + Varnish + Apache 问题

Stunnel + Varnish + Apache 问题

我目前在 apache 前面运行 Varnish 来处理所有 http 流量。我添加了 stunnel,以便也能利用 HTTPS 连接的缓存。因此,对于 HTTPS,stunnel 会与 varnish 通信,然后 varnish 会与 Apache 通信。

问题是,当 varnish 将缓存页面返回给 stunnel 时,stunnel 会通过 HTTPS 将其发送到客户端,但其余资源(例如 css 文件、js 文件等)则由客户端通过纯 HTTP 请求。我猜这是因为缓存页面仅包含指向资源的 HTTP 链接。

我的问题是:

  1. 这是反向 SSL 代理的常见问题吗?

  2. 有什么办法可以防止这种情况的发生吗?

  3. 假设我有一个域名 www.example.com,我希望它只能通过 HTTPS 访问,并且我还希望http://www.example.com不返回 404,而是重定向到https://www.example.com。如何避免循环(即 varnish 重定向到 stunnel,然后 stunnel 通过 HTTP 再次从 varnish 请求页面,然后 stunnel 再次重定向到 stunnel 等)。有没有办法让 stunnel 插入 varnish 会查找的标头,以便在标头存在时不执行任何重定向?

答案1

在某些网站中,如果您从 HTTP 版本切换到 HTTPS 版本,则应通知网站配置,例如“嘿,我们现在通过 HTTPS 提供服务”。嗯,原因是某些网站已将配置硬编码到其静态文件 URL 生成器中。因此,即使它们通过 HTTPS 提供服务,静态资源 URL 生成器仍认为我们正在通过 HTTP 进行通信。

现在,你怀疑 varnish 缓存仍在提供旧内容。这个猜测可能是真的……好吧,你可以清除缓存,以便确认理论

要重定向部分,您可以配置 varnish,以便它们执行重定向任务。将此行添加到 varnish 配置内sub vcl_recv

if (!req.http.X-Forward-For && client.ip !~ localhost) {
    set req.http.x-Redir-Url = "https://" + req.http.host + req.url;
    error 750 req.http.x-Redir-Url;
}

逻辑:如果某个随机 IP(本地主机除外)连接到 varnish(因为它们仍使用 HTTP 版本),则 varnish 会发出重定向到 HTTPS 的问题。VCL 逻辑取自这个博客

概括

  1. 要解析静态文件 URL 部分,您应该 (1) 检查网站配置并告知它我们现在通过 HTTPS 提供服务,以及 (2) 清除 varnish 缓存。

  2. 将 HTTP 重定向到 HTTPS 任务可以通过 varnish 完成

相关内容