Elastic Beanstalk không hỗ trợ nhiều cổng từ Container Docker đơn, vì vậy bạn cần xử lý việc này ở cấp proxy như đề xuất. Tuy nhiên, phiên bản EC2 của bạn không cần biết về chứng chỉ của bạn, bởi vì bạn có thể chấm dứt kết nối SSL tại bộ cân bằng tải.
Trong .ebextensions
thư mục của bạn , tạo cấu hình cho proxy nginx chứa hai cấu hình máy chủ; một proxy http://docker
(cấu hình mặc định, cổng 80) và một proxy chuyển hướng sang https (Tôi đã chọn cổng 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'
Tạo cấu hình thứ hai cho bộ cân bằng tải EB và các nhóm bảo mật thiết lập chúng như sau:
- Ví dụ EC2 :
- Cho phép lưu lượng truy cập trên các cổng 80/8080 từ bộ cân bằng tải
- Cho phép lưu lượng truy cập trên cổng 22 từ bất cứ đâu (để truy cập ssh, tùy chọn)
- Cân bằng tải :
- Chuyển tiếp cổng 443 HTTPS sang cổng 80 HTTP
- Chuyển tiếp cổng 80 HTTP sang cổng 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>"
} ]
}
}
}
(Lưu ý: đừng quên thay thế SSLCertertId và VpcId bằng các giá trị của bạn).
Bất kỳ lưu lượng truy cập nào trên cổng 80 của bộ cân bằng tải (HTTP) sẽ chạm vào cổng 8080 trên phiên bản EC2, chuyển hướng đến HTTPS. Lưu lượng truy cập trên cổng 443 trên bộ cân bằng tải (HTTPS) cuối cùng sẽ được phục vụ bởi cổng 80 trên phiên bản EC2, đó là proxy docker.