2012-05-22 68 views
11

我檢查IP地址在控制器錯誤nginx的+獨角獸+ IP地址軌

request.env['REMOTE_ADDR'] 

能正常工作在我的測試環境。 但是在帶有nginx + unicorn的生產服務器上,我總是得到127.0.0.1

這是我的網站nginx的配置:

upstream unicorn { 
    server unix:/tmp/unicorn.urlshorter.sock fail_timeout=0; 
} 

server { 
    listen 80 default deferred; 
    # server_name example.com; 
    root /home/deployer/apps/urlshorter/current/public; 

    location ^~ /assets/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @unicorn; 
    location @unicorn { 
    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; 
    proxy_pass http://unicorn; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

回答

3

答案就在你的配置文件:以下應該做你想要什麼:

real_ip = request.headers["X-Real-IP"] 

更多在這裏:http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-headers

UPDATE正確答案在這裏是另一個Q:

https://stackoverflow.com/a/4465588

或在此線程:

https://stackoverflow.com/a/15883610

擾流板:

使用request.remote_ip

+1

不是因爲這種方法的大風扇不在我的開發環境中使用的工作薄。 – dgmdan

+0

你說得對。我已經解決了答案。 – forker

17

我有這個太麻煩;我發現了這個問題,但其他答案沒有幫助我。

我看着Rails 3.2.8的Rack :: Request#ip的實現,看它如何決定說什麼;爲了讓它使用通過環境傳遞的地址而不過濾掉本地網絡的地址(它試圖過濾出中間代理,但這不是我想要的),我必須另外從我的nginx代理配置塊中設置HTTP_CLIENT_IP你上面的本事(X - 轉發,對於已在那裏了這個工作!):

proxy_set_header CLIENT_IP $remote_addr; 
+2

幫助我與nginx +獨角獸+ sinatra以及。 – glasz

6

如果使用request.remote_addr你會得到你的Nginx的代理權。

要獲得用戶的真實IP地址,您可以使用request.remote_ip

根據Rails的源代碼,它會檢查各種HTTP頭,給你最相關的一個:in Rails 3.2Rails 4.0.0.beta1

3

proxy_set_header CLIENT_IP $remote_addr;沒有爲我工作。以下是做什麼的。

我在查看actiondispatch代碼remote_ip.rb源文件後找到的解決方案。現在我在我的設備/監督程序以及我正在查看的任何其他例程中獲得正確的IP。我的配置... Ruby 2.2.1 - Rails 4.2.1 - NGINX v1.8.0 - Unicorn v4.9.0 - Devise v3.4.1

nginx。CONF

HTTP_CLIENT_IP VS CLIENT_IP

location @unicorn { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header HTTP_CLIENT_IP $remote_addr; <----- 
    proxy_redirect off; 
    proxy_pass http://unicorn; 
} 

源ActionPack的-4.2.1/LIB/action_dispatch /中間件/ remote_ip.rb

線114:

client_ips = ips_from('HTTP_CLIENT_IP').reverse 

126行:

"HTTP_CLIENT_IP=#{@env['HTTP_CLIENT_IP'].inspect} " + 
4

對於ELB - nginx的 - 導軌要按照本指南:

http://engineering.blopboard.com/resolving-real-client-ip-with-amazon-elb-nginx-and-php-fpm

參見:

server { 
    listen 443 ssl spdy proxy_protocol; 

    set_real_ip_from 10.0.0.0/8; 
    real_ip_header proxy_protocol; 

    location /xxx { 
    proxy_http_version 1.1; 
    proxy_pass <api-endpoint>; 
    proxy_set_header  Host    $http_host; 
    proxy_set_header  X-Forwarded-By $server_addr:$server_port; 
    proxy_set_header  X-Forwarded-For $remote_addr; 
    proxy_set_header  X-Forwarded-Proto $scheme; 
    proxy_set_header  X-Real-IP   $remote_addr; 
    proxy_set_header  CLIENT_IP   $remote_addr; 
    proxy_pass_request_headers on; 
    } 
    ... 
+0

謝謝!有一個問題,該應用程序收到「獨角獸」作爲HTTP_HOST,因此在重定向期間,Rails被重定向到「http:// unicorn/posts'和'http:// MY_SERVER/posts',這解決了我的問題。 – pcasa

+0

@todd Blopboard鏈接無效 – TheRealMrCrowley

相關問題