Pergunta

Então, eu tenho uma configuração simples com nginx para mídias estáticas e balanceamento de carga e furacão como webserver para Django (4 servidores rodando). Meu problema é remote_addr não ser repassado a Django então eu estou ficando um KeyError:

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

O endereço remoto está sendo enviada através de X-Real-IP (HTTP_X_REAL_IP) graças à 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 é anexado à chave META Eu não posso simplesmente fazer proxy_set_header remote_addr $ remote_addr. O que eu poderia fazer é ler a X-Real-IP se nenhuma tecla endereço remoto é encontrado, mas estou curioso para saber se há uma solução mais inteligente.

Obrigado!

Foi útil?

Solução

Tente esta:

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

Basta adicionar proxy_set_header REMOTE_ADDR e deve ser um trabalho bem.

Tentou com:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

Outras dicas

Aqui está como eu resolvido o problema. Ao utilizar 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 ajude!

Eu tenho uma configuração similar. Depois de colocar nginx na frente de apache, notei que o IP nos logs de apache foi sempre 127.0.0.1. Instalar "libapache2-mod-rpaf" parecia para corrigi-lo. Eu não tenho idéia se o seu problema está relacionado.

Adicionar "fastcgi_param REMOTE_ADDR $ remote_addr;" para o arquivo 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;
    ...
}

Fonte: como nginx servidores virtuais + fcgi para Django

Para mim, usando o seguinte funcionou:

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

Isso funciona com Django 1.4 (especificamente, localshop).

Não, é não é possível passar remote_addr. Assim, a única solução que eu conheço é a utilização X-Real-IP ou X-Forwarded-For e certifique-se que as alças de back-end estes corretamente.

Edit: isso se aplica a fastcgi_pass, não é regular nginx proxy_pass

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top