如何为运行 nginx 的 Elastic Beanstalk 将 http 重定向到 https?

Bre*_*ett 5 https http nginx docker amazon-elastic-beanstalk

我知道关于这个确切的主题有很多 SO 问题。但是,似乎没有一个适用于最新版本的 Elastic Beanstalk / Docker 组合。

我在Docker 中运行Django/Python Web 应用程序,然后将其部署到 Elastic Beanstalk。我希望 http 和 https 处于活动状态,因此我在AWS EB配置控制台中启用了端口80443。这很好用。我的网站可以通过 http 和 https 访问。然而,这真的不是我想要的。我希望端口80 ( http ) 自动转发到端口443 ( https )。

我已经按照 SO 和其他论坛上的每一条建议来调试这个,但我认为那里的信息太旧了。(即,不再有效)。

我找到了 EB 在哪里设置它的服务器(在一个名为 : 的文件中/etc/nginx/sites-enabled/elasticbeanstalk-nginx-docker-proxy.conf),它的内容是:

map $http_upgrade $connection_upgrade {
  default  "upgrade";
  ""       "";
}

server {
  listen 80;
  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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当我从listen 80;to修改这个文件listen 443 ssl;并尝试在https上加载我的网站时,我得到ERR_CONNECTION_REFUSED.

有人可以指出我正确的方向来修改这个配置文件以从http重定向到https吗?

Edw*_*uel 1

我假设您使用了Python 3.4 和 uWSGI 2 (Docker) version 1.4.3。正如我在这里的回答,您需要定制您的 Elastic Beanstalk 环境:

  • 弹性负载均衡器
    • 侦听端口 80 并将其代理到 EC2 实例端口 80。
    • 侦听端口 443 并将其代理到 EC2 实例端口 443。
  • EC2 Web 服务器/代理
    • 侦听端口 80 并重定向到 HTTPS 进行响应。
    • 侦听端口 443 并处理请求。

我认为 EB 预定义 Python 3.4 (Docker) 和 Single Docker Container 几乎相同,除了 Python 方面的内容。我在《在 AWS Elastic Beanstalk 上启用 HTTPS 和 HTTP 重定向》中撰写了一篇文章。你可以在那里阅读指南。它告诉您如何配置 Elastic Beanstalk 单 Docker 容器服务 HTTPS 和 HTTP(重定向到 HTTPS)。

如果出现错误(通常是从第一个登陆页面上的 Elastic Beanstalk 示例启动它):

更新名为:sg-xxxxxxxx 的安全组失败原因:如果没有 VpcId,则无法指定 SecurityGroupEgress

你需要指定你的VpcId内部AWSEBLoadBalancerSecurityGroup > Properties。所以,配置应该是:

...
"AWSEBLoadBalancerSecurityGroup": {
  "Type": "AWS::EC2::SecurityGroup",
  "Properties": {
    "GroupDescription": "Allow HTTP and HTTPS",
    "VpcId": "vpc-xxxxxxxx",
    "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": 443,
        "ToPort": 443,
        "CidrIp": "0.0.0.0/0"
      }
    ]
  }
},
...
Run Code Online (Sandbox Code Playgroud)