我想配置Varnish使用HTTPS(!)服务作为后端服务。这里的关键是与后端服务连接的SSL部分!我对这些HTTPS后端服务的控制有限(将它们视为托管在云中的SaaS服务)。
它的设置如下:User-Agent - > AWS ELB作为SSL终止符 - > AWS中的清漆 - >云中的HTTPS SaaS服务
原因如下: - 我想用Varnish ESI用我自己的自定义页面标题来装饰SaaS服务UI。页脚。 - 通过让所有请求通过Varnish,我获得了有关SaaS服务的其他分析数据,否则我将无法获得 - 我可以使用Varnish重写SaaS服务的URL,有效地隐藏最终用户的SaaS服务URL
我能够将AWS ELB用作用户代理的SSL终结器,但是如何让Varnish作为源服务器访问HTTPS SaaS服务?
背景: 我在一个门户网站上工作,我们将向客户展示许多不同的服务(所有服务都有自己的现有用户界面,即他们没有无头的RESP API!)。将所有这些服务整合在一起的主要因素是常见的页眉和页脚(页眉显示顶级导航和登录/用户名注销)。
我们拥有的服务类型如下,都有自己的UI层,我们不想复制: - 托管在云中的白标第三方SaaS服务(例如Zendesk或Salesforce) - 在AWS中托管的内部开发的JavaEE / Spring服务 - 我们公司其他团队开发的服务,但它们托管在我们自己的数据中心
添加ESI包含适用于每项服务,但我不想重复为每项服务重复多次重复实施页眉/页脚的工作。
答案 0 :(得分:6)
不支持在Varnish中访问HTTPS后端。 Varnish向后端说HTTP。
如果要访问HTTPS后端内容,则必须通过另一个添加/删除HTTPS的守护程序/代理来代理它。有很多选择,其中一个是stunnel经过试验和测试。
根据你的描述(重写内容),我会说你非常接近使用错误的锤子。 Varnish可能不是最好的工具,您是否考虑过将mod_rewrite / mod_substitude粘在一起?
答案 1 :(得分:6)
我最近遇到了类似的要求,需要使用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连接发生...所以配置清单使用127.0.0.1:8888因为后端做我想要的事,因为清漆认为它正在与普通的http服务器通话,而不知道stunnel4代表它做了什么。
我无法保证这一点的可扩展性或可靠性,因为我只是没有让它工作,但到目前为止它似乎是一个可行的解决方法来解决这一限制。
答案 2 :(得分:0)
这是reference的Varnish Cache Plus的supported。
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)
}