无法在Rails 3中获取远程ip

时间:2013-12-20 08:55:40

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

我正在尝试在Rails 3中获取客户端IP。 应用程序安装在云托管中,使用SSL和nginx服务器。

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

request.remote_ip
request.env['HTTP_X_FORWARDED_FOR']

但它返回错误的地址,如'10 .159.21.86' 是否存在与Nginx服务器或SSL安装相关的问题?

3 个答案:

答案 0 :(得分:0)

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或其他工具来隐藏它e.t.c.)。所以你也可以尝试: -

request.env['REMOTE_ADDR']

你应visit这篇由rails撰稿人撰写的文章描述重复标题和Ruby网络服务器

答案 1 :(得分:0)

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

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

  

文档团队正在制定正式文档,短期内,请打开一张票,支持工程师可以提供帮助。

答案 2 :(得分:0)

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

另一种选择是使用Elastic Load Balancer而不是HAProxy。该文档位于https://support.cloud.engineyard.com/entries/21715452-Use-Elastic-Load-Balancing-with-Engine-Yard-Cloud

埃文