【问题标题】:How can I redirect http to https for Elastic Beanstalk running nginx?对于运行 nginx 的 Elastic Beanstalk,如何将 http 重定向到 https?
【发布时间】:2015-07-09 12:35:42
【问题描述】:

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

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

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

我找到了 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;
  }
}

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

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

【问题讨论】:

    标签: http docker nginx https amazon-elastic-beanstalk


    【解决方案1】:

    您是否尝试过在 settings.py 中进行配置并让 django 处理该过程。

    SECURE_SSL_REDIRECT = True
    

    【讨论】:

    • 这个比较适合发表评论,虽然我知道低声望不会让你这么做。
    • 你是救世主。我已经尝试配置 nginx 两天了,它根本不起作用。这个 django 配置立即生效。谢谢
    【解决方案2】:

    截至 2018 年 8 月,对于放置在 Docker 容器中的 Python (Flask) 应用,nginx 放在前面,SSL 证书放在AWS 证书管理器。

    configuring the load balancer 监听 80 和 443 端口后,您可以通过创建一个文件来配置从 http 到 https 的重定向。一般来说,它会为你在 nginx 配置中添加一个if 语句:

    if ($http_x_forwarded_proto = 'http') {
                      return 301 https://$host$request_uri;
                  }
    

    TL;DR: 这是由您在 Beanstalk 应用程序项目的父目录中创建的 .ebextensions 目录中的以下文件完成的。给文件一个选定的名称,例如force-https,但请记住使用 .config 扩展名。如果您使用 git,请不要忘记提交新文件!

    我的app/.ebextensions/force-https.config 文件(YAML - 缩进很重要!):

    files:
    
      "/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf" :
        mode: "000755"
        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;
    
              if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
                  set $year $1;
                  set $month $2;
                  set $day $3;
                  set $hour $4;
              }
              access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
    
              access_log    /var/log/nginx/access.log;
    
              location / {
                  if ($http_x_forwarded_proto = 'http') {
                      return 301 https://$host$request_uri;
                  }
                  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;
              }
          }
    

    说明:如果您希望重定向适用于将为您的应用程序启动的每个新部署和每个新 EC2 实例,您需要通过 Elastic Beanstalk .ebextensions 目录修改 nginx 配置.理论上,这个改变可以直接在应用的EC2实例的nginx配置文件中完成(使用ssh连接机器),但这不是一个好的解决方案,因为当实例终止或当你部署一个新版本的应用程序。

    我们打算在其中添加上述if 语句的文件放在应用的EC2 实例中的/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf 中。我们的带有替换说明的文件需要在您在项目的父目录中创建的.ebextensions 目录中创建。它需要指定要覆盖的文件(上面代码中的files:)。 Elastic Beanstalk 将在部署您的应用程序时应用此 .config 文件,方法是在每台新机器上覆盖指定的 nginx 文件。

    【讨论】:

    • 我一直在反对这个问题,并且有很多不同的解决方案。这个成功了!谢谢!
    【解决方案3】:

    我假设你使用了Python 3.4 with uWSGI 2 (Docker) version 1.4.3。正如我在here 中的回答,您需要对您的 Elastic Beanstalk 环境进行定制:

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

    我虽然 EB Predefined Python 3.4 (Docker) 和 Single Docker Container 几乎相同,但 Python 方面除外。我在Enable HTTPS and HTTP-Redirect on AWS Elastic Beanstalk 写了一篇文章。你可以在那里阅读指南。它告诉您如何配置 Elastic Beanstalk 单个 Docker 容器服务 HTTPS 和 HTTP(重定向到 HTTPS)。

    如果出现错误(通常是从第一个登录页面上的 Elastic Beanstalk 示例开始):

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

    您需要在AWSEBLoadBalancerSecurityGroup > Properties 中指定您的VpcId。所以,配置应该是:

    ...
    "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"
          }
        ]
      }
    },
    ...
    

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 2017-02-04
      • 2019-01-24
      • 2016-06-19
      • 2018-09-30
      • 2020-02-08
      • 2023-03-10
      • 2013-12-08
      • 2018-01-01
      相关资源
      最近更新 更多