Elastic Beanstalk는 단일 Docker 컨테이너에서 여러 포트를 지원하지 않으므로 제안 된대로 프록시 수준에서이 포트를 처리해야합니다. 그러나로드 밸런서에서 SSL 연결을 종료 할 수 있으므로 EC2 인스턴스는 인증서에 대해 알 필요가 없습니다.
.ebextensions
디렉토리에서 두 개의 서버 구성을 포함하는 nginx 프록시 구성을 작성 하십시오 . 프록시 http://docker
(기본 구성, 포트 80) 및 https로 리디렉션하는 포트 (포트 8080을 선택).
.ebextensions/01-nginx-proxy.config
:
files:
"/etc/nginx/sites-available/000-default.conf":
mode: "000644"
owner: root
group: root
content: |
map $http_upgrade $connection_upgrade {
default "upgrade";
"" "";
}
server {
listen 80;
gzip on;
gzip_comp_level 4;
gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
access_log /var/log/nginx/access.log;
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 8080;
location / {
return 301 https://$host$request_uri;
}
}
commands:
00_enable_site:
command: 'rm -f /etc/nginx/sites-enabled/* && ln -s /etc/nginx/sites-available/000-default.conf /etc/nginx/sites-enabled/000-default.conf'
다음과 같이 설정하는 EB로드 밸런서 및 보안 그룹에 대한 두 번째 구성을 작성하십시오.
- EC2 인스턴스 :
- 로드 밸런서에서 포트 80/8080의 트래픽 허용
- 어디에서나 포트 22의 트래픽 허용 (ssh 액세스, 선택적)
- 로드 밸런서 :
- 포트 443 HTTPS를 포트 80 HTTP로 전달
- 포트 80 HTTP를 포트 8080 HTTP로 전달
.ebextensions/02-load-balancer.config
:
"Resources" : {
"AWSEBSecurityGroup": {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Instance security group (22/80/8080 in)",
"SecurityGroupIngress" : [ {
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
}, {
"IpProtocol" : "tcp",
"FromPort" : "8080",
"ToPort" : "8080",
"SourceSecurityGroupId" : { "Ref" : "AWSEBLoadBalancerSecurityGroup" }
}, {
"IpProtocol" : "tcp",
"FromPort" : "22",
"ToPort" : "22",
"CidrIp" : "0.0.0.0/0"
} ]
}
},
"AWSEBLoadBalancerSecurityGroup": {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : {
"GroupDescription" : "Load balancer security group (80/443 in, 80/8080 out)",
"VpcId" : "<vpc_id>",
"SecurityGroupIngress" : [ {
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}, {
"IpProtocol" : "tcp",
"FromPort" : "443",
"ToPort" : "443",
"CidrIp" : "0.0.0.0/0"
} ],
"SecurityGroupEgress": [ {
"IpProtocol" : "tcp",
"FromPort" : "80",
"ToPort" : "80",
"CidrIp" : "0.0.0.0/0"
}, {
"IpProtocol" : "tcp",
"FromPort" : "8080",
"ToPort" : "8080",
"CidrIp" : "0.0.0.0/0"
} ]
}
},
"AWSEBLoadBalancer" : {
"Type" : "AWS::ElasticLoadBalancing::LoadBalancer",
"Properties" : {
"Listeners" : [ {
"LoadBalancerPort" : "80",
"InstancePort" : "8080",
"Protocol" : "HTTP"
}, {
"LoadBalancerPort" : "443",
"InstancePort" : "80",
"Protocol" : "HTTPS",
"SSLCertificateId" : "arn:aws:iam::<certificate_id>:<certificate_path>"
} ]
}
}
}
(참고 : SSLCertificateId 및 VpcId를 값으로 바꾸는 것을 잊지 마십시오).
로드 밸런서 (HTTP)의 포트 80에있는 모든 트래픽은 EC2 인스턴스에서 포트 8080에 도달하여 HTTPS로 리디렉션됩니다. 로드 밸런서 (HTTPS)의 포트 443에서 트래픽은 도커 프록시 인 EC2 인스턴스의 포트 80에서 제공됩니다.