簡體   English   中英

如何為運行 nginx 的 Elastic Beanstalk 將 http 重定向到 https?

[英]How can I redirect http to https for Elastic Beanstalk running nginx?

我知道在這個確切的主題上有很多 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;
  }
}

當我從listen 80;修改此文件時listen 80; listen 443 ssl; 並嘗試在https上加載我的網站,我得到ERR_CONNECTION_REFUSED

有人可以指出我正確的方向來修改這個配置文件以從http重定向到https嗎?

截至 2018 年 8 月,對於放置在Docker容器中的Python (Flask)應用程序, nginx放置在前面,並在 AWS Certificate Manager 中使用 SSL 證書。

將負載均衡器配置為偵聽端口 80 和 443 后,您可以通過創建一個文件來配置從 http 到 https 的重定向。 通常,它會為您在 nginx 配置中添加一個if語句:

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

TL;DR:這是通過放置在.ebextensions目錄中的以下文件完成的,該目錄是您在 Beanstalk 應用程序項目的父目錄中創建的。 為文件指定一個選定的名稱,例如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語句的/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf位於應用程序 EC2 實例的/etc/nginx/sites-available/elasticbeanstalk-nginx-docker-proxy.conf中。 我們需要在您在項目父目錄中創建的.ebextensions目錄中創建帶有替換說明的文件。 它需要指定要覆蓋的files:files:在上面的代碼中)。 Elastic Beanstalk 將在部署您的應用程序時通過覆蓋每台新機器中指示的 nginx 文件來應用此.config文件。

您是否嘗試過在 settings.py 中配置它並讓 django 處理該過程。

SECURE_SSL_REDIRECT = True

我假設你使用Python 3.4 和 uWSGI 2 (Docker) version 1.4.3 正如我在此處的回答,您需要對 Elastic Beanstalk 環境進行 coustumized:

  • 彈性負載均衡器
    • 偵聽端口 80 並將其代理到 EC2 實例端口 80。
    • 偵聽端口 443 並將其代理到 EC2 實例端口 443。
  • EC2 Web 服務器/代理
    • 偵聽端口 80 並響應重定向到 HTTPS。
    • 偵聽端口 443 並為請求提供服務。

我雖然 EB Predefined Python 3.4 (Docker) 和 Single Docker Container 幾乎相同,除了 Python 之外。 在 AWS Elastic Beanstalk 上啟用 HTTPS 和 HTTP 重定向中寫了一篇文章。 你可以閱讀那里的指南。 它告訴您如何配置 Elastic Beanstalk Single Docker Container 服務 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"
      }
    ]
  }
},
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM