我正在构建一个具有一些相当神秘的TLS和缓存要求的应用程序,并且我使用的堆栈看起来像:
HTTPS HTTP
Nginx (443) Varnish (80)
| |
Varnish (80) Nginx (8080)
\ /
AWS ALB (80)
|
ECS Pool (Docker) - Apache/80
(我让Nginx在Varnish和ALB之间收听8080,因为Varnish没有像Nginx那样轻松处理多个/更改IP地址的DNS查询。)
问题是HTTPS请求路径:基本上,Nginx设置X-Forwarded-Proto: https
,然后我配置了Varnish VCL以安全地将其传递给ALB。但ALB似乎剥离了标头并将其替换为自己的标头(变为X-Forwarded-Proto: http
),然后ECS服务器上的后端应用程序看到http并将其所有链接/资源路径写为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请求的静态资源。我想,解决这个问题的唯一方法就是用Varnish和自定义vmod或其他工具(Lambda等)完全替换ALB,以解释不断变化的ECS Docker容器实例池......
有没有办法命令AWS ALB / ELB通过标头或对标头的任何控制?我无法在文档或控制台中找到任何内容,而其他大多数人似乎都在ALB上终止HTTPS。如果我只有一个证书,或者只有一个,或者可以使用SNI,我肯定会这样做......但我有数百个域名的数百个证书,并且不能:(