如何使用Fargate在AWS ECS上配置基于Laravel的应用程序?

如何使用Fargate在AWS ECS上配置基于Laravel的应用程序?,laravel,amazon-web-services,docker,aws-fargate,Laravel,Amazon Web Services,Docker,Aws Fargate,编辑:我的第一个问题是“如何使用Fargate在AWS ECS上链接任务定义内的容器?”但是,可能从一开始我就错了,所以我更改了我的问题,并保留以下内容: 我正在尝试通过ECS在AWS上部署一个简单的基于Laravel的应用程序。 我的服务使用docker compose yml文件在本地正常工作 但在AWS上,我从我的web容器日志中得到:“nginx:[emerg]主机未在/etc/nginx/conf.d/default.conf的上游“app”中找到:12” 这里是我的服务的容器:web

编辑:我的第一个问题是“如何使用Fargate在AWS ECS上链接任务定义内的容器?”但是,可能从一开始我就错了,所以我更改了我的问题,并保留以下内容:

我正在尝试通过ECS在AWS上部署一个简单的基于Laravel的应用程序。 我的服务使用docker compose yml文件在本地正常工作

但在AWS上,我从我的web容器日志中得到:
“nginx:[emerg]主机未在/etc/nginx/conf.d/default.conf的上游“app”中找到:12”

这里是我的服务的容器:web(nginx)、app(Laravel)、数据库(MySQL)和缓存(redis)

我知道任务描述的所有容器都共享相同的名称空间,因此不需要链接容器(我们无论如何不能将links属性用于Fargate)

你能帮我找到这个问题吗?我瞎了

这里是我的本地工作docker-compose.yml文件:

version: '2'
services:

  #  The Application
  app:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-
maison/tribe-migrate
    volumes:
      - /var/www/storage
    env_file: '.env'
    environment:
      - "DB_HOST=database"
      - "REDIS_HOST=cache"

  # The Web Server
  web:
    image: 696759765437.dkr.ecr.us-east-1.amazonaws.com/ali-maison/laravel-web
    ports:
      - 80:80

  # The Database
  database:
    image: mysql:5.6
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=homestead"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"

  # redis
  cache:
    image: redis:3.0-alpine

volumes:
  dbdata:
这里是我的web容器Dockerfile:

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www
和我的vhost.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
从vhost.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
fastcgi\u通行证app:9000

主机名“app”适用于docker compose,因为这是您在docker-compose.yml中为服务命名的名称。docker compose为它必须管理的容器创建了一个新的网络,该网络允许容器通过主机名相互引用,而无需进一步配置

Fargate没有此功能,因此“应用程序”无法解析

Fargate目前唯一允许您使用的网络模式是一种特殊的AWS模式,称为。Fargate中运行的每个任务都有自己的弹性网络接口(ENI),这意味着每个任务都有自己的私有IP地址。您还可以将ENI配置为具有公共IP地址,就像在EC2实例上使用ENI一样


如何从nginx容器解析应用程序容器

在Fargate中,深入到应用服务器的运行任务定义(集群>任务选项卡>单击应用服务器任务列中的容器ID)。网络部分将具有专用IP

在您的配置中将主机名“app”替换为此ip:


fastcgi\u通行证:9000

对于可能遇到此问题的其他人,我在aws ecs fargate上连接在同一任务中运行的两个容器时遇到了相同的问题,我发现我必须在vhost.conf中将“app”替换为“localhost”,并且成功了。(关于另一个答案的一些评论中提到了这一点) 因此vhost.conf看起来像:

server {
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass localhost:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
我还确保端口9000已映射并公开在应用程序容器上(可能不需要)

解决办法是:

  • 确保在同一任务中定义了两个容器,例如nginx php
  • 对php fpm使用localhost:port例如localhost:9000
  • 上面提到了第二部分,但没有明确说明两个容器必须处于同一任务中


    您可以在此处找到更多信息:

    看起来像是一个相关问题,但我似乎无法在ECS上的任务描述配置中应用任何建议:/使用Fargate,尝试将
    app:9000
    替换为
    127.0.0.1:9000
    ,您是否设法使其正常工作?你能告诉我你的任务定义是什么样的吗?什么命令可以使用Docker Compose创建这样的堆栈?硬编码地址是非常糟糕的做法。应该有另一条路。我们可以使用
    localhost
    ?虽然关于它为什么不起作用的信息很有用,但正如@RomanNewaza指出的,您提出的解决方案不是一个好的解决方案。将特定于任务的IP地址构建到容器配置中不是一个好选项,因为这意味着容器无法在其他地方工作,或者如果IP地址在任务之间不一致。使用端口9000上的localhost作为fastcgi_pass参数会导致我的nginx出现502错误。我将尝试从OP获取更多信息并更新此答案。对IP进行硬编码是可行的,但在使用Fargate时,这样做在现实世界中是没有用的(即,这是一种不好的做法)。在这里,重复他人的观点是非常重要的。如果nginx和php容器被配置为在同一个fargate任务中运行,那么您需要使用127.0.0.1作为nginx对fastcgi_pass的配置IP,即
    fastcgi_pass 127.0.0.1:9000