我正在构build一个具有一些相当神秘的TLS和caching需求的应用程序,并且使用如下所示的堆栈:
HTTPS HTTP Nginx (443) Varnish (80) | | Varnish (80) Nginx (8080) \ / AWS ALB (80) | ECS Pool (Docker) - Apache/80
(我有Nginx在8080之间在Varnish和ALB之间侦听,因为Varnish不像Nginx那样容易地处理多个/改变IP地址的DNS查找)。
问题是HTTPS请求path:基本上,Nginx设置了X-Forwarded-Proto: https
,然后我将Varnish VCLconfiguration为安全地将其传递给ALB。 但ALB似乎剥离了头部并用自己的头部(它变成了X-Forwarded-Proto: http
)取代它,然后ECS服务器上的后端应用程序看到http并将所有链接/资源path写为http,导致Safari,Chrome等不安全的混合内容警告
所以唯一能够使这个设置工作的方法是绕过Varnish,在ALB上安装一个仅限于后端的TLS证书,并设置请求路由,如:
HTTPS HTTP Nginx (443) Varnish (80) | | AWS ALB (443) AWS ALB (80) \ / \ / ECS Pool (Docker) - Apache/80
我基本上可以这样做…但是我不能使用Varnish为HTTPS请求caching静态资源。 唯一的解决办法就是用完整的Varnish和一个自定义的vmod或其他一些工具(Lambda等)来替代ALB,以解决不断变化的ECS Docker容器实例池…
有什么方法可以指挥AWS ALBs / ELBs通过标题或对标题进行任何types的控制? 我无法在文档或控制台中find任何内容,而大多数其他人似乎正在终止ALB上的HTTPS。 如果我只有一个证书或一些证书,或者可以使用SNI,我肯定会这么做……但是我有成百上千个域的证书,而且不能:(