Elastic Beanstalk强制https

我遇到的问题是通过AWS Elastic Beanstalk部署的网站强制使用HTTPS。

这是一个使用EmberJS的前端应用程序。 我已经绕了很多天,试图找出如何将httpstream量redirect到https。 我在EC2计算机上使用Amazon Linux AMI。

我已经得出结论(仍然不确定这是否正确),它不在Elastic Beanstalk中,我强制使用HTTPS。 我允许HTTP和HTTPS通过我的Elastic Beanstalk负载平衡器,并试图在服务器上redirect。

这是我遇到问题的地方。 我find了很多关于重写规则的答案,没有使用基于X-Forwarded-Proto Header的mod_rewrite ,但是根据查找search,我的EC2机器上不存在该文件。

我也尝试在.ebextensions目录中创build一个configuration文件,但是这也不起作用。

我正在尝试做的主要事情是有用户指向https时,尝试击中http地址。 任何指针或build议非常感谢,谢谢!

编辑:我正在使用64位Debian jessie v1.4.1运行Python 3.4(预configuration – 泊坞窗)

我认为您需要指定您使用的Elastic Beanstalk环境(请参阅: 支持的平台 ),因为不同的环境具有不同的configuration。

基本上,你需要自定义:

  • 弹性负载平衡器
    • 在端口80上侦听并将其代理到EC2实例端口80。
    • 在端口443上侦听,并将其代理到EC2实例端口443。
  • EC2 Web服务器/代理
    • 在端口80上收听,并redirect到HTTPS。
    • 听取端口443并提供请求。

要定制它,您可以使用CLI或.ebextensions

您可以检查在AWS Elastic Beanstalk上启用HTTPS和HTTPredirect 。 它告诉您如何configurationElastic Beanstalk单一Docker容器提供HTTPS和HTTP(redirect到HTTPS)。 您可以根据需要调整configuration。

通过使用由ELB设置的X-Forwarded-Proto报头,也可以在不触及负载平衡器的情况下更容易地实现这一点。 这是我最终做的:

 files: "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf": mode: "00644" 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; } if ($http_x_forwarded_proto = 'http') { return 301 https://$host$request_uri; } } 

Elastic Beanstalk不支持单个Docker容器中的多个端口,因此您需要按照build议在代理级别处理此操作。 但是,您的EC2实例不需要知道您的证书,因为您可以在负载平衡器上终止SSL连接。

.ebextensions目录中,为包含两个服务器configuration的nginx代理创build一个configuration; 一个代理http://docker (默认configuration,端口80),一个redirect到https(我select了端口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负载均衡器和安全组创build第二个configuration,如下所示:

  • EC2实例
    • 允许来自负载均衡器的端口80/8080上的stream量
    • 允许来自任何地方的端口22的stream量(用于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>" } ] } } } 

(注意:不要忘记用您的值replaceSSLCertificateId和VpcId)。

负载均衡器(HTTP)的端口80上的任何stream量都将在EC2实例上的端口8080上redirect到HTTPS。 负载平衡器(HTTPS)上的端口443上的stream量将最终由作为泊坞窗代理的EC2实例上的端口80提供服务。