如何使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别