如何使用Fargate在AWS ECS上配置基于Laravel的应用程序?
编辑:我的第一个问题是“如何使用Fargate在AWS ECS上链接任务定义内的容器?”但是,可能从一开始我就错了,所以我更改了我的问题,并保留以下内容: 我正在尝试通过ECS在AWS上部署一个简单的基于Laravel的应用程序。 我的服务使用docker compose yml文件在本地正常工作 但在AWS上,我从我的web容器日志中得到:如何使用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
“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代码>