【问题标题】:Proper way to set up Rails 6 on AWS ECS在 AWS ECS 上设置 Rails 6 的正确方法
【发布时间】:2021-08-26 22:37:41
【问题描述】:

我在 AWS ECS 上部署了 Rails 6(与 Puma 一起运行)。有一个 ECS 服务和一个 ECS 任务,任务启动托管我的应用程序的 EC2 实例。我还使用我的 ECS 服务创建了一个应用程序负载均衡器。我向负载均衡器添加了一个 HTTPS 侦听器。我的听众指向一个目标组,该目标组专门通过 HTTP 协议接受流量。

我对请求流程的理解:

HTTPS request from internet:
  --> hits AWS load balancer 
    --> hits HTTPS listener
      --> passes traffic using HTTP to Target Group
        --> request finally reaches Rails app on Target Group EC2 targets *over HTTP*

这是一个有效的设置吗?我读了这个StackOverflow answer,我的解释是我们只需要为我们的负载均衡器使用HTTPS,而不是Puma,因此不需要目标组。

我还为我的目标组设置了一个通过 HTTP 的健康检查,它期望 301 状态代码响应作为一个健康的目标(因为我的 Rails 配置中有config.force_ssl)。问题是,为什么来自负载均衡器的流量没有被重定向?为什么来自健康检查的流量会被重定向?他们不是都针对同一个目标群体吗?为什么一个请求导致 200 而另一个导致 301?

我画了一张图,试图表达我的问题/困惑/当前的理解:

这是我的负载均衡器和目标组设置:

不确定这是 AWS 问题还是 Puma 问题或其他问题。接受所有想法!谢谢!!

【问题讨论】:

    标签: ruby-on-rails amazon-web-services amazon-ecs aws-application-load-balancer


    【解决方案1】:

    回答您的 2 个问题。

    1. 为什么来自负载平衡器的流量没有被重定向?

    This answer 也解释了它,但我会更深入一点:当负载均衡器接收到 HTTPS 连接并通过 HTTP 将其转发到您的 Rails 服务器时,它将为请求设置一个 X-FORWARDED-PROTO=https 标头,Rails 明白这对于 force_ssl 配置来说已经足够了。

    代码路径是Rails https://github.com/rails/rails/blob/main/actionpack/lib/action_dispatch/middleware/ssl.rb(根据该文件中的 cmets,当 config.force_ssl 为真时,它包含在请求链中)将调用 request.ssl?

    request 在该上下文中是https://github.com/rails/rails/blob/main/actionpack/lib/action_dispatch/http/request.rb 的一个实例,但您不会找到那里定义的ssl? 方法;但是,该类包括 include Rack::Request::Helpers

    如果你去Rack的源代码,你会发现https://github.com/rack/rack/blob/master/lib/rack/request.rb中定义了ssl?方法,它调用了scheme方法,X-Forwarded-Proto头会在elsif forwarded_scheme中被检查部分。你去 :) 即使它是一个 HTTP 请求也很困难,该标头的存在将使 request.ssl? 返回 true。

    1. 为什么来自运行状况检查的流量会被重定向?

    在这种情况下,它是从负载均衡器到您的应用程序的 HTTP 请求,它不携带 X-Forwarded-For 或 X-Forwarded-Proto 标头,因此 Rail 的 config.force_ssl 正在做它应该做的事情并且重定向。

    最后,查看 config.force_ssl 上的 documentation。您实际上可以将其设置为选项哈希,并从 force_ssl 行为中排除您的健康检查网址!

    config.ssl_options = { redirect: { exclude: -> request { request.path =~ /healthcheck/ } } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-23
      • 2020-06-27
      • 2023-03-15
      • 2020-11-10
      • 2020-08-12
      • 2019-02-02
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多