【问题标题】:Using Varnish with SaaS HTTPS backend servers?将 Varnish 与 SaaS HTTPS 后端服务器一起使用?
【发布时间】:2025-12-19 15:15:12
【问题描述】:

我想将 Varnish 配置为使用 HTTPS(!) 服务作为后端服务。这里的关键是与后端服务连接的 SSL 部分!我对这些 HTTPS 后端服务的控制有限(将它们视为托管在云中的 SaaS 服务)。

这是一个这样的设置:用户代理 -> AWS ELB 作为 SSL 终结者 -> AWS 中的 Varnish -> 云端的 HTTPS SaaS 服务

原因如下: - 我想使用 Varnish ESI 用我自己的自定义页眉和页脚来装饰 SaaS 服务 UI。 - 通过让所有请求都通过 Varnish,我获得了有关 SaaS 服务的额外分析数据,否则我将无法获得这些数据 - 我可以使用 Varnish 重写 SaaS 服务的 URL,有效地向最终用户隐藏 SaaS 服务 URL

我可以将 AWS ELB 作为 SSL 终结器,用于用户代理,但如何让 Varnish 作为源服务器访问 HTTPS SaaS 服务?

背景: 我在一个门户网站上工作,我们将在其中向我们的客户展示许多不同的服务(所有服务都有自己现有的 UI,即它们没有无头 RESP API!)。将所有这些服务整合在一起的主要是一个通用的页眉和页脚(页眉显示*导航和登录名/用户名注销)。

我们拥有的服务类型如下,它们都有自己的 UI 层,我们不想复制: - 托管在云中的白标第 3 方 SaaS 服务(例如 Zendesk 或 Salesforce) - 内部开发的 JavaEE/Spring 服务,托管在 AWS 中 - 我们公司其他团队开发的服务,但它们托管在我们自己的数据中心中

对于这些服务中的每一个都可以添加 ESI 包含,但我不想为每个服务重复多次重新实现页眉/页脚的工作。

【问题讨论】:

标签: https varnish saas portal edge-side-includes


【解决方案1】:

不支持在 Varnish 中访问 HTTPS 后端。 Varnish 向后端发送 HTTP。

如果您想访问 HTTPS 后端内容,您必须通过另一个添加/去除 HTTPS 的守护程序/代理对其进行代理。对此有很多选择,其中之一是stunnel,它已经过尝试和测试。

根据您所描述的(重写内容),我会说您非常接近使用错误的锤子。 Varnish 可能不是最好的工具,您是否考虑过使用 mod_rewrite/mod_substitude 将它们粘合在一起?

【讨论】:

  • 使用 SSL Terminator 删除 TLS,然后使用 stunnel 读取它??如果我错了,请纠正我,但这对我来说似乎不合逻辑,还是我应该说矫枉过正?我的意思是您想使用缓存来使您的应用程序更快,但由于 SSL Terminator 和 stunnel 以及其他资源使其工作,因此需要使用大量额外的 CPU 周期。这也增加了额外的网络延迟,我想知道这些配置(SSL Terminator & stunnel)会带来多少性能提升..
  • 4.0版本开始Varnish Cache Plus(商业版)支持HTTPS后端。 varnish-software.com/plus/ssl-tls-support
【解决方案2】:

我最近遇到了类似的要求,需要使用 https 访问所需的后端。

当然,对于为什么这是错误的方法,可以提出很多反对意见......但在这种情况下,我受到以下事实的限制:我需要将数据加密到后端、很远的地理距离,以及由于各种系统的所有权和控制权而无法使用 VPN。

这是一种解决方法,根据我的有限测试,它似乎有可能使用stunnel4 解决此问题。

配置中的示例行:

client  = yes
[mysslconnect]
accept  = 8888
connect = dest.in.ation.host.or.ip:443

现在,stunnel4 正在我的本地(清漆)机器上侦听端口 8888,每次传入连接到达时,它都会与远程系统上的端口 443 建立 ssl 连接。

与本地服务器上的 127.0.0.1 端口 8888 的连接允许我向目标后端服务器发送明文 HTTP,这发生在实际上由 stunnel4 管理的 SSL 连接上...因此配置 varnish 以使用127.0.0.1:8888 作为后端执行我的意图,因为 varnish 认为它正在与普通的 http 服务器通信,不知道 stunnel4 代表它在做什么。

我不能保证它的可扩展性或可靠性,因为我只是没有让它工作,但到目前为止,它似乎是解决 varnish 限制的可行解决方法。

【讨论】:

  • 关于这种方法的可靠性或可扩展性的任何更新?
  • @chmac 这个设置的 stunnel4 方面自从我设置它以来一直工作完美......虽然在我发布这个之后不久,我将负载均衡器本身从清漆切换到了 haproxy——这正是1.4 版中后端 SSL 的限制与 varnish 相同,所以我仍然以相同的方式使用 stunnel4。我对 varnish 没有任何问题,也没有任何令人信服的理由来切换到 haproxy —— 我当时实际上正在评估两者,而且这个应用程序不需要缓存,所以我选择了感觉最轻量级的选项。
  • 太棒了,感谢更新,感谢。我遇到了一些 SNI 问题,但我会解决这些问题的...... :-)
【解决方案3】:

这是supported 由 Varnish Cache Plus 提供,isn't free

backend default {
    .host = "backend.example.com";
    .port = "443";
    .ssl = 1;               # Turn on SSL support
    .ssl_sni = 1;           # Use SNI extension  (default: 1)
    .ssl_verify_peer = 1;   # Verify the peer's certificate chain (default: 1)
    .ssl_verify_host = 1;   # Verify the host name in the peer's certificate (default: 0)
}

【讨论】: