2012-05-22 11 views
11

puedo comprobar la dirección IP en el controlador conincorrecto Dirección IP con Nginx + unicornio carriles

request.env['REMOTE_ADDR'] 

esto funciona bien en mi entorno de prueba. Pero en el servidor de producción con unicornio nginx + siempre recibo 127.0.0.1.

Esta es mi configuración de nginx para el sitio:

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; 
} 

Respuesta

3

La respuesta está en su archivo de configuración :) Lo que sigue debe hacer lo que quiera:

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

más aquí: http://api.rubyonrails.org/classes/ActionDispatch/Request.html#method-i-headers

ACTUALIZACIÓN: correcta respuesta está aquí en otra Q:

https://stackoverflow.com/a/4465588

o en este hilo:

https://stackoverflow.com/a/15883610

alerón:

uso request.remote_ip

+1

un gran fan de este enfoque, ya que no funciona en mi entorno de desarrollo utilizando delgada . – dgmdan

+0

Tienes razón. He arreglado la respuesta. – forker

17

tuve problemas con esto también; Encontré esta pregunta, pero la otra respuesta no me ayudó.

Miré la implementación de Rack :: Request # ip de Rails 3.2.8 para ver cómo se decidía qué decir; para que use una dirección pasada por el entorno sin filtrar las direcciones de mi red local (está tratando de filtrar los proxies intermedios, pero eso no es lo que yo quería), tuve que establecer HTTP_CLIENT_IP desde mi bloque de configuración de proxy nginx además a lo que tienes por encima (X-reenviado-a tiene que estar allí también para que esto funcione!):

proxy_set_header CLIENT_IP $remote_addr; 
+2

me ayudó con nginx + unicorn + sinatra también. – glasz

6

Si utiliza request.remote_addr que obtendrá la de su proxy Nginx.

Para obtener la dirección IP real de su usuario, puede usar request.remote_ip.

De acuerdo con el código fuente de Rails, comprueba varias cabeceras HTTP para darle la más relevante uno: in Rails 3.2 o Rails 4.0.0.beta1

3

El proxy_set_header CLIENT_IP $remote_addr; no funcionó para mí. Esto es lo que hizo ..

La solución que encontré después de revisar el código actiondispatch remote_ip.rb fuente. Ahora obtengo la IP adecuada en mis procesos de diseño/protección, así como en cualquier otra rutina que esté buscando request.remote_ip

Mi config ... 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; 
} 

Fuente actionpack-4.2.1/lib/action_dispatch/middleware/remote_ip.rb

Línea 114:

client_ips = ips_from('HTTP_CLIENT_IP').reverse 

Línea 126:

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

Para ELB - nginx - carriles desea seguir esta guía:

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

Ver:

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; 
    } 
    ... 
No
+0

¡Gracias! Estaba teniendo un problema con la aplicación que estaba recibiendo "unicornio" como HTTP_HOST, por lo que durante la redirección Rails estaba redirigiendo a 'http: // unicorn/posts' vs' http: // MY_SERVER/posts' y esto resolvió mi problema. – pcasa

+0

@todd El enlace Blopboard no es válido – TheRealMrCrowley