Elastik Beanstalk, Tek Docker Konteynerindeki birden fazla bağlantı noktasını desteklemez, bu nedenle bunu önerilen proxy düzeyinde işlemeniz gerekir. Ancak EC2 yönetim ortamınızın sertifikanızı bilmesi gerekmez, çünkü yük dengeleyicisinde SSL bağlantısını sonlandırabilirsiniz.
Senin içinde .ebextensions
dizine, iki sunucu yapılandırmaları içeren nginx proxy için bir yapılandırma oluşturmak; biri proxy http://docker
(varsayılan yapılandırma, bağlantı noktası 80) ve diğeri https'ye yönlendirir (bağlantı noktası 8080'i seçtim).
.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 yük dengeleyici ve güvenlik grupları için bunları aşağıdaki gibi ayarlayan ikinci bir yapılandırma oluşturun:
- EC2 örneği :
- Yük dengeleyiciden 80/8080 bağlantı noktalarında trafiğe izin ver
- Bağlantı noktası 22'de her yerden trafiğe izin ver (ssh erişimi için, isteğe bağlı)
- Yük dengeleyici :
- Bağlantı noktası 443 HTTPS'yi bağlantı noktası 80 HTTP'ye ilet
- Bağlantı noktası 80 HTTP'yi bağlantı noktası 8080 HTTP'ye ilet
.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>"
} ]
}
}
}
(Not: SSLCertificateId ve VpcId değerlerini değiştirmeyi unutmayın).
Yük dengeleyicinin (HTTP) 80 numaralı bağlantı noktasındaki tüm trafik EC2 örneğinde HTTPS'ye yönlendiren 8080 numaralı bağlantı noktasına çarpacaktır. Yük dengeleyicideki (HTTPS) 443 numaralı bağlantı noktasındaki trafik, docker proxy'si olan EC2 örneğinde 80 numaralı bağlantı noktası tarafından sunulur.