Ruby on rails 当从专用NIC访问时,Rails将IP显示为127.0.0.1,但Nginx显示了正确的IP。公共IP被转发罚款

Ruby on rails 当从专用NIC访问时,Rails将IP显示为127.0.0.1,但Nginx显示了正确的IP。公共IP被转发罚款,ruby-on-rails,networking,nginx,ip,unicorn,Ruby On Rails,Networking,Nginx,Ip,Unicorn,我们正在Unicorn+Nginx上运行Rails应用程序。服务器有两个我们使用的NICeth0处理公共互联网的请求,eth2处理来自我们私人网络的请求 当通过eth0发出请求时,nginx日志显示公共IP,Rails日志也显示此IP。但是,当通过eth2发出请求时,nginx日志会正确显示私有IP(例如192.168.5.134),而Rails日志会显示127.0.0.1 因此,似乎eth0上的公共请求正确设置了X-Forwarded-For头,但eth2上的请求不会发生这种情况 我们的ngi

我们正在Unicorn+Nginx上运行Rails应用程序。服务器有两个我们使用的NIC
eth0
处理公共互联网的请求,
eth2
处理来自我们私人网络的请求

当通过
eth0
发出请求时,nginx日志显示公共IP,Rails日志也显示此IP。但是,当通过
eth2
发出请求时,nginx日志会正确显示私有IP(例如
192.168.5.134
),而Rails日志会显示
127.0.0.1

因此,似乎
eth0
上的公共请求正确设置了
X-Forwarded-For
头,但
eth2
上的请求不会发生这种情况

我们的nginx配置非常基本:

upstream example.com {
  server unix://var/www/example.com/shared/sockets/unicorn.socket fail_timeout=0;
}

...

server {
  listen 443 ssl;
  ...

  location @example.com  {
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real_IP $remote_Addr;
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if ($host ~* "^(.+)\.example.com$") {
      set $subdomain $1;
    }

    proxy_pass http://example.com;
  }

有什么想法吗?

问题是Rails认为任何
192.168.x.x
地址都是一个私有地址,所以将它们从
x-Forwarded\u的
头中删除

# IP addresses that are "trusted proxies" that can be stripped from
# the comma-delimited list in the X-Forwarded-For header. See also:
# http://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces
TRUSTED_PROXIES = %r{
  ^127\.0\.0\.1$                | # localhost
  ^(10                          | # private IP 10.x.x.x
    172\.(1[6-9]|2[0-9]|3[0-1]) | # private IP in the range 172.16.0.0 .. 172.31.255.255
    192\.168                      # private IP 192.168.x.x
   )\.
}x
请参阅相关的Rails源代码和

一种解决方案是将其添加到
config/application.rb

config.action_dispatch.trusted_proxies = /^127\.0\.0\.1$/ # localhost
这样,本地网络上的IP将不会被“127.0.0.1”所取代