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

408 HTTP 错误尝试使用负载均衡器访问 AWS 弹性 beanstalk 上的 https

如何将健康检查请求 ip 添加到负载均衡器安全组?

aws 弹性负载均衡器可以将端口 443 转发到端口 443 以获取弹性 beantalk 实例吗?

使用 AWS 弹性 beanstalk 负载均衡器在 Rails 上实施 https 连接

我们可以将两种不同类型的 AWS EC2 实例与弹性 beantalk 负载均衡器一起使用吗

在 aws 弹性负载均衡器上无法让 https 使用自签名证书