题 使用force_ssl = true运行Rails3,使用nginx,在AWS EC2上使用由ELB终止的SSL,设置运行状况检查


我想用SSL运行我的整个Rails应用程序,所以我想使用Rails的全局force_ssl配置选项,这很好用,除了ELB的healthchecker永远不会工作,因为如果我将它设置为http,Rails将转发到https with a 301,健康检查将失败,因为它不是200.如果我将其设置为https,nginx / rails将无法处理请求,因为SSL由ELB处理,而nginx / rails仅处理HTTP。

我的非理想解决方案是对例外做出例外 global force_ssl 仅用于健康检查页面,但是Rails' global force_ssl config始终覆盖 force_ssl :except => :health_check 所以这似乎不起作用。

另一种解决方案是不使用ELB进行SSL终止,并设置HAProxy左右,但我希望尽可能多地使用亚马逊的基础设施,更多地关注项目的核心开发而不是基础设施。

这是我的第一个服务器故障帖子,所以我感谢我能得到的任何帮助(或者我可以提供的更多信息)。谢谢。

更新:

到目前为止,我通过让ELB通过不同于80的不同端口访问EC2实例来“解决”这一点,只有它可以访问,这感觉极端,但在应用程序和服务器层之间保持分离。如果健康检查请求来自此端口的ELB,则nginx会将X-Forwarded-Proto标头集转发为“https”,这将让Rack认为它来自SSL,并让它通过。对于通过标准端口80进入的所有其他流量,它只是转发由ELB给出的X-Forwarded-Proto报头,它将准确报告外部用户正在使用的内容,并让Rails决定强制https或不依赖。

还在等待更清洁的解决方案,但这就是我所拥有的。


6
2017-12-28 03:28






答案:


6个月后,这是您的清洁解决方案。

# config/environments/production.rb
config.ssl_options = { exclude: proc { |env| env['PATH_INFO'].start_with?('/health_check') } }

5
2018-06-20 21:49





应该注意的是,config.ssl_options的exclude选项现已弃用,您必须这样做 使用rack-ssl gem来获得相同的行为

我只是为了健康检查而包含和初始化一个新的机架中间件似乎不是一个好主意,所以我决定使用nginx来设置健康检查器的$ http_x_forwarded_proto标头。

这就是我想出的:

location @unicorn {

  if ($http_user_agent ~ "ELB-HealthChecker")
  {
    set $http_x_forwarded_proto https;
  }

  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://unicorn;
}

现在rails将Health Checker请求视为https(尽管它们不是)并返回成功。


3
2017-09-18 23:19





经过几天摔跤与配置等,我发现了这个伟大的宝石:

https://github.com/lserman/aws-healthcheck

无需任何自定义nginx设置(它可以通过机架工作)。它回来了 200 on / healthcheck就像魅力一样。只需将它添加到您的宝石中就可以了。


0
2018-03-24 20:58





如果你的健康检查点击你的Rails应用程序(你可能应该......),你实际上并不在意,那么你可以将它指向静态文件,如/robots.txt,并使用HTTP / 80而不是HTTPS / 443。 Nginx将提供静态文件,而不涉及Rails。

并不是说我真的推荐这个长期,但是如果你很难通过你的ELB得到任何东西,这将有助于排除故障。


-1
2017-10-07 17:46