在使用多容器Docker环境在Amazon Elastic Beanstalk上设置HTTPS / SSL时,我一直在环顾四周并找不到有关最佳做法的内容。
在单容器配置方面有很多东西,但在多容器方面没什么。
我的Dockerrun.aws.json看起来像这样:
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "app-frontend",
"host": {
"sourcePath": "/var/app/current/app-frontend"
}
},
{
"name": "app-backend",
"host": {
"sourcePath": "/var/app/current/app-backend"
}
}
],
"containerDefinitions": [
{
"name": "app-backend",
"image": "xxxxx/app-backend",
"memory": 512,
"mountPoints": [
{
"containerPath": "/app/app-backend",
"sourceVolume": "app-backend"
}
],
"portMappings": [
{
"containerPort": 4000,
"hostPort": 4000
}
],
"environment": [
{
"name": "PORT",
"value": "4000"
},
{
"name": "MIX_ENV",
"value": "dev"
},
{
"name": "PG_PASSWORD",
"value": "xxxx"
},
{
"name": "PG_USERNAME",
"value": "xx"
},
{
"name": "PG_HOST",
"value": "xxxxx"
}
]
},
{
"name": "app-frontend",
"image": "xxxxxxx/app-frontend",
"memory": 512,
"links": [
"app-backend"
],
"command": [
"npm",
"run",
"production"
],
"mountPoints": [
{
"containerPath": "/app/app-frontend",
"sourceVolume": "app-frontend"
}
],
"portMappings": [
{
"containerPort": 3000,
"hostPort": 80
}
],
"environment": [
{
"name": "REDIS_HOST",
"value": "xxxxxx"
}
]
}
],
"family": ""
}
到目前为止,我的想法是我需要将一个nginx容器放入混合中,以便代理这两个服务并处理将不同的域名映射到不同服务的事情。
我是否会采用通常的方式来设置nginx并正常配置SSL,或者是否有更好的方法,就像我在使用.ebextensions方法的单个容器中看到的那样(http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/https-singleinstance-docker.html )?
答案 0 :(得分:1)
这更像是一个想法(我实际上并没有这样做,也不确定它是否有用)。但是这些组件似乎都可以创建一个ALB,可以根据路径规则将流量引导到一个或另一个进程。
以下是我认为可以通过基于http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html提供的选项.ebextensions
配置文件来完成的事情:
aws:elasticbeanstalk:environment:process:default
确保默认应用程序端口和运行状况检查按照您的意图设置(假设在这种情况下,端口80是默认设置。aws:elasticbeanstalk:environment:process:process_name
创建进入第二项服务的backend
进程(本例中为端口4000)。aws:elbv2:listenerrule:backend
为后端创建规则,使用/backend/*
作为路径。aws:elbv2:listener:443
(示例位于http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environments-cfg-applicationloadbalancer.html)创建使用此新后端规则的SSL侦听器。我不确定是否需要为aws:elbv2:listener:default
的默认侦听器创建其他规则。看起来默认值可能只匹配/*
所以在这种情况下,发送到/backend/*
的任何内容都将转到端口4000容器,其他任何内容都会转到端口3000容器。
答案 1 :(得分:1)
你肯定需要一个nginx容器,因为一个简单的事实是多容器ELB设置默认情况下不提供一个容器。您在ELB上看到使用这些.ebextension配置的单个容器设置的原因是,对于这种类型的设置,ELB确实提供了nginx。
拥有自己的nginx容器的好处是你不需要前端容器(假设你正在提供静态文件)。您可以编写我们的nginx配置,以便直接提供静态文件。
这是我的Dockerrun文件:
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "dist",
"host": {
"sourcePath": "/var/app/current/frontend/dist"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/compose/production/nginx/nginx.conf"
}
}
],
"containerDefinitions": [
{
"name": "backend",
"image": "abc/xyz",
"essential": true,
"memory": 256,
},
{
"name": "nginx-proxy",
"image": "nginx:latest",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"depends_on": ["backend"],
"links": [
"backend"
],
"mountPoints": [
{
"sourceVolume": "dist",
"containerPath": "/var/www/app/frontend/dist",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/nginx.conf",
"readOnly": true
}
]
}
]
}
我还强烈建议您使用AWS服务来设置SSL:Route 53和Certificate manager。它们可以很好地协同工作,如果我理解正确,它允许您在负载平衡级别上应用SSL。