Pregunta

Así que obtuve una configuración simple con nginx para medios estáticos y equilibrio de carga y tornado como servidor web para django (4 servidores en ejecución). Mi problema es que remote_addr no se pasa a django, así que obtengo un KeyError:

article.ip = request.META ['REMOTE_ADDR']

La dirección remota se envía como X-Real-IP (HTTP_X_REAL_IP) gracias a nginx.conf:

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect false;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://frontends;
    }

Como HTTP se antepone a la tecla META, no puedo simplemente hacer proxy_set_header remote_addr $ remote_addr. Lo que podría hacer es leer X-Real-IP si no se encuentra una clave de dirección remota, pero tengo curiosidad por saber si hay una solución más inteligente.

¡Gracias!

¿Fue útil?

Solución

Pruebe este:

location / {
    proxy_pass http://frontends;
    proxy_pass_header Server;
    proxy_redirect off;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header REMOTE_ADDR $remote_addr;
}

Simplemente agregue proxy_set_header REMOTE_ADDR y debería funcionar bien.

Probado con:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

Otros consejos

Así es como resolví el problema. Al usar este middleware:

class SetRemoteAddrMiddleware(object):
    def process_request(self, request):
        if not request.META.has_key('REMOTE_ADDR'):
            try:
                request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP']
            except:
                request.META['REMOTE_ADDR'] = '1.1.1.1' # This will place a valid IP in REMOTE_ADDR but this shouldn't happen

¡Espero que eso ayude!

Tengo una configuración similar. Después de poner nginx frente a apache, noté que la IP en los registros de apache siempre era 127.0.0.1. Instalación de "libapache2-mod-rpaf" Parecía arreglarlo. No tengo idea si su problema está relacionado.

Añadir " fastcgi_param REMOTE_ADDR $ remote_addr; " al archivo nginx.conf:

    location / {
    # host and port to fastcgi server
    fastcgi_pass 127.0.0.1:8801;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;
    ...
    # Add this line!
    fastcgi_param REMOTE_ADDR $remote_addr;
    ...
}

Fuente: cómo nginx servidores virtuales + fcgi para django?

Para mí, usar lo siguiente funcionó:

server {
    listen 80;
    server_name foo.bar.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

Esto funciona con django 1.4 (específicamente, localshop).

No, es no es posible transmitir remote_addr. Entonces, la única solución que conozco es usar X-Real-IP o X-Forward-For y asegurarse de que el back-end los maneje correctamente.

Editar: esto se aplica a fastcgi_pass, no a nginx proxy_pass normal

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top