[英]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配置控制台中啟用了端口80和443 。 這很好用。 我的網站可以通過 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:
我雖然 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.