【问题标题】:Can not get remote ip in Rails 3在 Rails 3 中无法获取远程 IP
【发布时间】:2014-01-09 02:00:47
【问题描述】:

我正在尝试在 Rails 3 中获取客户端 IP。 应用安装在云主机中,带有 SSL 和 nginx 服务器。

我写了一些代码来获取客户端 ip。

request.remote_ip
request.env['HTTP_X_FORWARDED_FOR']

但它返回错误的地址,例如'10.159.21.86' 是否有任何与 Nginx 服务器或 SSL 安装相关的问题?

【问题讨论】:

  • 这个ip和你的应用所在机器的ip一样吗?
  • 可能你的流量通过了 nginx/varnish/stunnel/etc 并且源地址发生了变化。请咨询您的云提供商,了解如何获取用户的真实 IP 地址
  • 我记得遇到过类似的问题。您可以尝试安装 nginx real_ip 模块。检查是否有帮助。

标签: ruby-on-rails ruby nginx ip engineyard


【解决方案1】:
def remote_ip  
  @remote_ip ||= (@env["action_dispatch.remote_ip"] || ip).to_s
end

request.remote_ip 在本地代理之外获取客户端的 IP 地址,但是如果您的请求来自您的开发机器并且开发机器是您的服务器所在的位置,那么您可能会得到 127.0.0.1 或错误的 IP 但如果请求来自另一台机器,这将是远程机器的 IP。但是,在各种情况下,这可能不是机器的真实 IP(代理后面的机器,使用 tor 或其他工具隐藏它等)。所以你也可以试试:-

request.env['REMOTE_ADDR']

您应该 visit 这篇由 rails 贡献者撰写的描述重复标头和 Ruby Web 服务器的帖子

【讨论】:

    【解决方案2】:

    我相信您遇到的问题与以下 Engine Yard 支持请求中描述的相同:HAProxy, SSL Requests & Request IP Addresses

    显然有一种解决方法,但您应该直接与他们联系以了解它是什么。

    文档团队正在编写正式文档,短期内,请开工单,支持工程师可以提供帮助。

    【讨论】:

      【解决方案3】:

      如果您将 SSL 与 HAProxy 一起使用(多实例环境的默认配置),那么由于从 HAProxy 到 Nginx 的切换,它将无法提取远程 IP。我们有一个使用 stunnel 解决此问题的解决方案,但由于所有 SSL 解密都是在 App Master 实例上完成的,如果您有超过大约五个实例,那么性能将会受到影响。

      另一种选择是使用弹性负载均衡器而不是 HAProxy。相关文档位于https://support.cloud.engineyard.com/entries/21715452-Use-Elastic-Load-Balancing-with-Engine-Yard-Cloud

      埃文

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多