我是不是需要 AWS ECS 中带有 nginx 的 AWS 负载均衡器?

Posted

技术标签:

【中文标题】我是不是需要 AWS ECS 中带有 nginx 的 AWS 负载均衡器?【英文标题】:Do I need AWS Load balancer with nginx in AWS ECS?我是否需要 AWS ECS 中带有 nginx 的 AWS 负载均衡器? 【发布时间】:2020-04-19 08:04:33 【问题描述】:

我在 AWS ECS 中使用 Docker。我有一台带有来自 AWS ECS 的 docker 代理的 EC2 机器,ECS 任务包含 3 个容器:

nginx 容器 application-nodejs 容器 staticfiles-nodejs-application 容器。

我想支持非常巨大的流量。我是否需要设置 AWSLoad Balancer?还是我对 nginx 上游的设置就足够了?

nginx 配置示例:

upstream appwww                                                                                             
    server app-www:3000;                                                                                     
                                                                                                             

server                                                                                                       
    server_name  my.home.net;                                                                       

     location /                                                                                              
        proxy_pass http://appwww;                                                                            
        proxy_http_version 1.1;                                                                               
        proxy_set_header Upgrade $http_upgrade;                                                               
        proxy_set_header Connection 'upgrade';                                                                
        proxy_set_header Host $host;                                                                          
        proxy_cache_bypass $http_upgrade;                                                                     
                                                                                                             

    listen 443 ssl http2; # managed by Certbot                                                                      
    ssl_certificate......; # managed by Certbot            
    ssl_certificate_key........ # managed by Certbot          
    include /.......# managed by Certbot                                     
    ssl_dhparam /.....pem; # managed by Certbot                                       

                                                                                                             


server                                                                                                       
    if ($host = my.host.net)                                                                       
        return 301 https://$host$request_uri;                                                                 
     # managed by Certbot                                                                                    


    listen       80;                                                                                          
    server_name  my.host.net;                                                                       
    return 404; # managed by Certbot                                                                          
                                                                                                          

编辑

我画了正确的架构,我想添加LoadBalancer,我应该把它放在哪里?自动缩放适合这张图吗?我应该使用一台或多台 ec2 机器吗?多容器?多上游?

【问题讨论】:

【参考方案1】:

我建议你从使用负载均衡器开始,因为:

您可以在负载平衡器上配置 SSL 并在负载平衡器上终止 SSL

您可以通过将负载均衡器配置为与 AWS WAF 集成来保护自己免受恶意攻击

以后您可以轻松添加更多目标

缺少负载平衡器需要您在应用程序级别配置 SSL

支持健康检查。

您将获得免费的 ACM 证书以与负载均衡器一起使用 易于每年更新 SSL 证书

注意:考虑使用 AWS S3 和 cloudfront 来提供静态内容

在现有架构中引入负载平衡器

应用负载均衡器现在支持基于主机的路由,这意味着它可以使用指向多个网站的多个域(或子域)。除了基于主机的路由之外,它还支持基于路径的路由。例如 mydomain.com/web1 指向 website1 时,mydomain.com/web2 可以指向 website2

我想不出你需要使用 nginx 的原因(除非我遗漏了什么)。

所以回答你的问题,我会这样做。

介绍应用程序负载平衡器 通过 ECS (Fargate) 部署多个容器 对于每个服务,我将有一个目标组专门用于管理扩展和健康检查。 最后,我会做基于主机的路由,s1.mydomain.com、s2.mydomain.com 每个都指向不同的目标组(每个服务一个)

参考: https://aws.amazon.com/blogs/aws/new-host-based-routing-support-for-aws-application-load-balancers/

希望这会有所帮助。

【讨论】:

【参考方案2】:

正如你所说的

我想支持非常巨大的流量。

我希望在某些时候您需要将 AWS ECS 集群水平扩展为多个实例,此时您将需要一个 Elastic Load Balancer 来平衡它们之间的流量。

https://docs.aws.amazon.com/AmazonECS/latest/developerguide///service-load-balancing.html

【讨论】:

【参考方案3】:

如果这句话是真的

我要支持非常大的流量

除了 ECS 任务,您还需要了解 AWS ECS 中的不同概念:

Services Application Load Balancer Listeners Target groups AutoScaling(因为你要处理巨大的流量)

为了正确使用 AWS ECS,您需要同时使用这些服务。

【讨论】:

以上是关于我是不是需要 AWS ECS 中带有 nginx 的 AWS 负载均衡器?的主要内容,如果未能解决你的问题,请参考以下文章

让我们在 AWS ECS 上加密 docker nginx

spring boot 微服务在部署在 ecs aws 的容器中消耗大量内存

每个 docker compose yml 文件是不是与 AWS ECS 容器兼容

无法使 AWS ECS 服务通过服务发现进行通信

AWS - ECS + Application Load Balancer的思考

如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除