AWS ELB+反向代理(Nginx)+ELB:强制 SSL

AWS ELB+反向代理(Nginx)+ELB:强制 SSL

我已查看/尝试过之前在网上找到的建议,但无济于事。

我目前在 Nginx 反向代理前面设置了一个 ELB,然后将流量传递到 3 个不同的 ELB,这些 ELB 位于 3 个不同的 Web 应用程序(在 EC2 上运行)的前面。我需要确保进入第一个 ELB+Rev 代理的流量始终是 SSL。然后,rev 代​​理根据路由路由到各个应用程序。

这是我的 nginx/sites-available/example.conf 文件的片段:

server {
 listen 80;
 server_name staging.example.com;
 return 301 https://staging.example.com$request_uri;
}

server {
 listen 443 ssl;
 server_name staging.example.com;
 ssl_certificate /location
 ssl_certificate_key /location


 location /app1 {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header Host $http_host;
  proxy_pass http://ELB
 }

}

使用上述方法并尝试在网络上找到的先前信息时,一旦实施,第一个 ELB 将停止工作。如果我直接转到 rev 代​​理,流量不会通过,但页面不会出错,只会是空白。

问题:1. 假设我上面的 rev 代​​理设置正确,一旦流量变为 https 并进入 ELB/Rev 代理,它是否会继续通过 https 到达其他 ELB?换句话说,这些 ELB 是否需要打开入站 443,或者 80 是否会作为流量工作然后切换到 http?2. 我是否需要更改位置 /app1 配置中的任何设置,尤其是代理设置?

答案1

首先,让我确保我正确理解了您的设计:

--- HTTPS --> ELB -> nginx --- HTTP ---> ELB1 --> server1
                           --- HTTP ---> ELB1 --> server2
                           --- HTTP ---> ELB1 --> server3

那是对的吗?

假设以上正确,那么为了确保只有 HTTPS 进入第一个/前端 EBL,您可以在端口 443 上使用 HTTPS 侦听器配置该前端 ELB。就是这样。

至于你的第一个问题,从 ELB 发出到后端服务器的请求(前端 nginx) 将为 HTTP。您必须特意配置 ELB 以使用 SSL 进行后端连接。

这意味着,您的后端 ELB 只需要在端口 80 上监听 HTTP 请求。(或者端口 8080,或者您希望这些后端 ELB 使用的任何端口。)

我可能要补充的一个建议是,您创建一个单独的“frontend-elb”安全组和一个单独的“backend-elb”安全组。前端 ELB(和前端nginx实例!)应使用“frontelb-elb”安全组,后端 ELB(和后端 Web 应用实例!)应全部使用“backend-elb”安全组。“frontend-elb”安全组应允许来自任何地方的传入请求(当然,假设您希望您的服务公开可用)。但是,“backend-elb”安全组应该仅允许传入连接来自“frontend-elb”安全组。这将确保唯一办法到达您的 web 应用程序是通过前端 ELB,这反过来确保只有 HTTPS 请求才能到达您的 web 应用程序。

至于你的nginx代理配置,我思考看起来还不错。不过,我应该指出的是,AWS ELB 将自动地设置X-Forwarded-For(和X-Forwarded-Proto)标题;您可能不需要在配置中明确设置它nginx

希望这可以帮助!

相关内容