当我们使用AWS Application Load Balancer将传入请求重定向到我们的服务器时,我们创建了一个SSL证书并将其设置为负载均衡器。它都会侦听HTTP 80和HTTPS 443端口的流量。在这两种情况下,流量都会重定向到目标组实例的HTTP 80端口。
在这些情况下,有nginx服务器配置为侦听它们所在实例的HTTP 80端口。(这些实例是弹性容器服务实例)
当我更新nginx.conf文件以重定向传入的HTTP请求以重定向到HTTPS协议时,我们正面临重定向循环。即使原始请求是HTTPS请求,在负载均衡器后面,EC2实例也在侦听HTTP端口。因此,如果原始请求是HTTP或HTTPS无关紧要,则nginx无限发送重定向。
你有什么更简单的想法来解决这个问题吗?
答案 0 :(得分:3)
Nginx将始终通过HTTP获取请求,因此显然您无法告诉它重定向所有HTTP请求。 ELB在它发送到后端服务器(名为x-forwarded-proto
)的请求上设置一个特殊的HTTP头,您需要配置Nginx来检查浏览器和ELB之间的连接是通过HTTP还是HTTPS,并且只有重定向才是HTTP。我会检查ServerFault上的this answer。
答案 1 :(得分:0)
正如Mark B所提到的,检查传入prototol的自定义标头值是处理此问题并消除重定向循环的最简单方法。
但是,如果要确保端到端加密,可以在容器中部署自签名证书。负载均衡器不需要有效的公共证书才能连接到HTTPS源。
通过这种方式,您可以将ALB上的端口80转发到目标组上的端口80(您甚至可以只有一个单独的目标组用于重定向)并强制重定向,就像您现在所做的那样,并转发端口443 ALB到目标组的端口443。