10

Unicorn + Nginx で Rails アプリケーションを実行しています。サーバーには、使用する 2 つの 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;
  }

何か案は?

4

1 に答える 1

7

問題は、Rails がすべての192.168.x.xアドレスをプライベート アドレスと見なし、X-Forwarded_Forヘッダーから削除することでした。

# 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 のソースはこちらこちらを参照してください。

1 つの解決策は、これを に追加することconfig/application.rbです。

config.action_dispatch.trusted_proxies = /^127\.0\.0\.1$/ # localhost

そうすれば、ローカル ネットワークの IP が「127.0.0.1」に置き換えられることはありません。

于 2013-11-11T10:52:06.250 に答える