使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS
Posted
技术标签:
【中文标题】使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS【英文标题】:Redirect Elastic Beanstalk HTTP requests to HTTPS with nginx 【发布时间】:2019-01-24 19:15:51 【问题描述】:我希望在 Elastic Beanstalk 上使用 nginx 作为代理系统从 HTTP 请求重定向到 HTTPS。
我在 Google 上找到了很多建议,但没有人提供帮助,它不会重定向。
这是我当前在.ebexentions
目录中的test.config
文件:
files:
"/etc/nginx/conf.d/proxy.conf" :
mode: "000644"
owner: root
group: root
content: |
server
if ($http_x_forwarded_proto = "http")
return 301 https://$host$request_uri;
我也尝试了无数其他设置,但都没有奏效。
这是我的负载均衡器设置:
我希望你能帮助我。 :)
【问题讨论】:
您的 EB 设置是否带有负载均衡器?您是否查看了这篇 SO 文章中的所有内容? ***.com/questions/24297375/… 【参考方案1】:一些注意事项:
1 - 运行 Amazon Linux 2 的新 Amazon Elastic Beanstalk 平台版本具有不同的反向代理配置路径:
~/workspace/my-app/
|-- .platform
| `-- nginx
| `-- conf.d
| `-- elasticbeanstalk
| `-- 00_application.conf
`-- other source files
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html
2 - AWS ELB 运行状况检查器似乎无法检查 HTTPS 端点。 当然,如果您为您的域使用自定义证书,则无法检查他认为的“不受信任的站点”。 https://your-eb-app.eu-west-3.elasticbeanstalk.com 发布时使用此 DNS 别名 https://your-eb-app.your-organization.com 为您的组织注册的证书导致 ELB 健康检查器错误(证书域不匹配)。
3 - 建议的配置将所有位置暴露给 ANY 客户端,该客户端在标准 HTTP 端口 (80) 上显示为“ELB-HealthChecker*”用户代理;不是我们想要的:-)
你可以配置ELB Health Checker来接受HTTP 301状态,但是没有太大用处;一个简单的重定向响应并不意味着我们的 Web 应用程序运行良好 :-)
更安全的解决方案是专用的健康检查端点配置:
location /
set $redirect 0;
if ($http_x_forwarded_proto != "https")
set $redirect 1;
if ($redirect = 1)
return 301 https://$host$request_uri;
proxy_pass http://127.0.0.1:5000;
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;
location = /health-check.html
set $redirect 0;
if ($http_x_forwarded_proto != "https")
set $redirect 1;
if ($http_user_agent ~* "ELB-HealthChecker")
set $redirect 0;
if ($redirect = 1)
return 301 https://$host$request_uri;
proxy_pass http://127.0.0.1:5000;
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;
【讨论】:
我试过了,但是如果我把 00_application.conf 放在 elasticbeanstalk 里面,它就会被忽略完成。如果我把它提高一级,它会被读取,但它期望一些不同的东西。例如,如果我包含“位置”,我会在 /var/proxy/staging/nginx/conf.d/00_application.conf:1 中得到“位置”指令是不允许的。如果我只包含 server 指令,那么我会在 0.0.0.0:80 上得到冲突的服务器名称“”,被忽略(我想是因为服务器已经在主 nginx 配置中配置)。 您使用的是 Amazon Linux 2 平台吗?这些是我的机器nginx文件配置路径: [root@ip-172-99-99-55 ~]# find / -name 00_application.conf /etc/nginx/conf.d/elasticbeanstalk/00_application.conf /var/app/ current/.platform/nginx/conf.d/elasticbeanstalk/00_application.conf /var/proxy/staging/nginx/conf.d/elasticbeanstalk/00_application.conf【参考方案2】:我做了什么来实现,我用我的自定义给定 nginx.conf 以及一些位置指令的自定义配置完全覆盖了原始 nginx.conf
.plateform
-- nginx
-- nginx.conf
-- conf.d
-- elasticbeanstalk
--custom.conf
这是我的 nginx.conf
user nginx;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 32153;
events
worker_connections 1024;
http
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
include conf.d/*.conf;
map $http_upgrade $connection_upgrade
default "upgrade";
server
listen 80 default_server;
access_log /var/log/nginx/access.log main;
client_header_timeout 60;
client_body_timeout 60;
keepalive_timeout 60;
gzip off;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# Include the Elastic Beanstalk generated locations
include conf.d/elasticbeanstalk/*.conf;
以下代码将帮助我安全地覆盖配置
include conf.d/elasticbeanstalk/*.conf;
【讨论】:
您是如何获得原始 nginx 配置的,以便您可以安全地覆盖它?【参考方案3】:This 是唯一有效的解决方案。
AWS 创建后需要覆盖默认的 nginx 文件。所以必须还有两个文件:
-
编写 nginx 文件。
创建一个覆盖默认 nginx 文件的脚本。
在 AWS 创建默认文件后运行脚本。
【讨论】:
【参考方案4】:当我尝试使用 Nginx 在我的 AWS Elastic Beanstalk Go 环境中将所有 HTTP 流量重定向到 HTTPS 时,我遇到了类似的问题。这是解决方案,我是由 AWS Support 团队提供的:
在应用程序代码根目录的以下目录结构中创建一个文件。
.ebextensions/nginx/conf.d/elasticbeanstalk/00_application.conf
内容
location /
set $redirect 0;
if ($http_x_forwarded_proto != "https")
set $redirect 1;
if ($http_user_agent ~* "ELB-HealthChecker")
set $redirect 0;
if ($redirect = 1)
return 301 https://$host$request_uri;
proxy_pass http://127.0.0.1:5000;
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;
有关 AWS 提供的配置文件的完整列表,您应该查看 this link。
【讨论】:
这个解决方案对我不起作用,成功部署后elasticbeanstalk文件夹只包含两个文件healthd.conf php.conf @AliAbbas PHP 参考位于github.com/awsdocs/elastic-beanstalk-samples/blob/master/… 谢谢它尝试了太多东西,我只需要在 nginx/conf.d/elasticbeanstalk/custom.conf location /blog try_files $uri $uri/ /blog/index.php?$参数; gzip_static 开启; 位置 /blogs 返回 301 $scheme://site.com/blog; 位置 /blogs.html 返回 301 $scheme://site.com/blog; 位置 ~ ^/blogs/(.*) return 301 $scheme://site.com/blog; 但我不确定为什么这个文件夹没有添加任何文件以上是关于使用 nginx 将 Elastic Beanstalk HTTP 请求重定向到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Elastic beanstalk:使用 nginx/apache 将子域转发到子文件夹
Amazon Elastic Beanstalk ebextension 将 nginx 配置参数添加到默认配置中
Python3 + Nginx:将 HTTP 流量重定向到 AWS Elastic Beanstalk 上的 HTTPS
非 www 到 www 使用 AWS Elastic Load Balancer 和 Nginx