Domanda

Quindi ho ottenuto una semplice configurazione con nginx per supporti statici e bilanciamento del carico e tornado come server web per django (4 server in esecuzione). Il mio problema è che remote_addr non viene trasmesso a django, quindi ricevo un KeyError:

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

L'indirizzo remoto viene inviato come X-Real-IP (HTTP_X_REAL_IP) grazie 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;
    }

Dato che HTTP è anteposto alla chiave META, non posso semplicemente fare proxy_set_header remote_addr $ remote_addr. Quello che potrei fare è leggere l'X-Real-IP se non viene trovata alcuna chiave di accesso remoto ma sono curioso di sapere se esiste una soluzione più intelligente.

Grazie!

È stato utile?

Soluzione

Prova questo:

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 aggiungere proxy_set_header REMOTE_ADDR e dovrebbe funzionare bene.

Provato con:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

Altri suggerimenti

Ecco come ho risolto il problema. Usando questo 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

Spero che ti aiuti!

Ho una configurazione simile. Dopo aver messo nginx davanti ad Apache, ho notato che l'IP nei registri di Apache era sempre 127.0.0.1. Installare " libapache2-mod-rpaf " sembrava risolverlo. Non ho idea se il tuo problema è correlato.

Aggiungi " fastcgi_param REMOTE_ADDR $ remote_addr; " nel file 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: come nginx server virtuali + fcgi per django?

Per me, usando il seguente ha funzionato:

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

Funziona con django 1.4 (in particolare, localshop).

No, non è possibile trasmettere remote_addr. Quindi l'unica soluzione che conosco è usare X-Real-IP o X-Forwarded-For e assicurarsi che il backend li gestisca correttamente.

Modifica: questo si applica a fastcgi_pass, non al normale nginx proxy_pass

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top