如何使用 aws 弹性负载均衡器将 http 请求强制重定向到独立乘客中的 https?
Posted
技术标签:
【中文标题】如何使用 aws 弹性负载均衡器将 http 请求强制重定向到独立乘客中的 https?【英文标题】:How can i forcefully redirect http request to https in passenger standalone with aws elastic load balancer? 【发布时间】:2018-04-23 14:24:21 【问题描述】:我在我的应用程序中使用了独立乘客。目前我的应用程序同时在 http 和 https 上运行。我想将所有 http 请求重定向到 https。我在我的应用程序中使用了负载均衡器。 我读了这篇文章
https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb/
https://www.phusionpassenger.com/library/config/standalone/intro.html#nginx-configuration-template
http://code.eklund.io/blog/2015/03/17/managing-rewrites-for-a-rails-app-on-heroku-with-nginx-plus-phusion-passenger/
我尝试了这两种方法
1)
if ($http_x_forwarded_proto = "http")
return 301 https://$host$request_uri;
2)
if ($http_x_forwarded_proto != "https")
rewrite ^(.*)$ https://$server_name$REQUEST_URI permanent;
我以相同的方式尝试了所有过程。但是每次它进入无限循环并且在我开始乘客之前,由于请求超时过多,实例会自行终止并创建新实例。
我不知道是弹性负载均衡器问题还是乘客配置问题。我想当我停止乘客和用户尝试访问应用程序时。由于创建了新实例,因此请求超时。我不确定。
提前致谢:)
【问题讨论】:
基于 https 之前的一些问题,我发现在 NGINX 配置中您必须添加:proxy_set_header X-Forwarded-Proto https;
但是,如果您编辑您的帖子并向我们展示您的 NGINX 配置,我们可能能够为您提供更多帮助。
@RocKhalil 我没有passenger + NGINX,我使用Passenger Standalone。所以我没有nginx配置。我只有 erb 格式的乘客独立配置。
哦,好吧。我通常使用 puma 和 NGINX;对不起,没有帮助:-)
您在 ELB 中使用的是网络负载均衡器、应用程序负载均衡器还是经典负载均衡器?
@CamdenNarzt 经典负载均衡器
【参考方案1】:
我希望您的所有证书都已正确安装并指向正确的路径。如果不检查以下配置
Passenger.json
"environment": "production",
"instance_registry_dir": "/var/run/passenger-instreg",
"daemonize": true,
"user": "myappuser",
"port": 443,
"ssl": true,
"ssl_certificate": "/path/to/ssl_cert.pem",
"ssl_certificate_key": "/path/to/ssl_key.pem",
"nginx_config_template": "/path/to/nginx.conf.erb"
您需要使用与 nginx 相同的配置来从 http 重定向到 https
http
server_tokens off;
server
listen 80 default_server;
listen [::]:80 default_server;
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
最新链接 这是独立乘客从http重定向到https的配置latest_link
请参考link
【讨论】:
当我应用您的解决方案时,乘客会自动关闭。每当我尝试停止和启动乘客时,乘客都会自行关闭。和新实例创建多次。我不知道确切的问题是什么。 在我的登台服务器中,我没有应用负载均衡器。并且此配置成功应用于暂存,http 请求重定向到 https,但在我的实时服务器上它无法正常工作,因为负载均衡器可能是。 还有一件事,我认为端口值应该是 80 而 ssl-port 值应该是 443。 我还给你另一个关于独立乘客配置的链接,它可能会对你有所帮助。 我没有使用AWS Elastic Beanstalk
:(。当我复制乘客config.erb文件时,它给了我这个代码textb.org/t/vishal。我应该用这个代码更新整个文件@987654324 @ . 因为我过去已经尝试过了。但是它给了我 include_passenger_internal_template
这个命令的语法错误。【参考方案2】:
您可以在代理级别或应用级别执行此操作。在应用级别执行此操作:
# config/environments/production.rb
...
config.force_ssl = true
...
【讨论】:
我第一次尝试,但由于负载均衡器,它进入了无限循环。 这将导致无限循环并最终失败,正如 Vishal 指出的那样 "在代理级别,或在应用级别" 两者都重定向确实会导致重定向循环。以上是关于如何使用 aws 弹性负载均衡器将 http 请求强制重定向到独立乘客中的 https?的主要内容,如果未能解决你的问题,请参考以下文章