Frage

Also habe ich ein einfaches Setup mit nginx für statische Medien und Load-Balancing und Tornado als Webserver für django (4-Server läuft). Mein Problem ist remote_addr nicht weitergegeben immer django so bin ich einen KeyError bekommen:

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

Die Remote-Adresse wird als X-Real-IP gesendet durch immer (HTTP_X_REAL_IP) dank der 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;
    }

Als HTTP an den META Schlüssel vorangestellt kann ich nicht nur tun proxy_set_header remote_addr $ remote_addr. Was ich tun konnte, den X-Real-IP gelesen wird, wenn keine Remote-Adr Schlüssel gefunden wird, aber ich bin gespannt, ob es eine intelligentere Lösung.

Danke!

War es hilfreich?

Lösung

Versuchen Sie dieses:

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

Fügen Sie einfach proxy_set_header REMOTE_ADDR und es sollte gut sein arbeiten.

Versuchte mit:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

Andere Tipps

Hier ist, wie ich das Problem gelöst. Durch die Nutzung dieser 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

Ich hoffe, das hilft!

Ich habe ein ähnliches Setup. Nachdem er nginx vor Apache, bemerkte ich, dass die IP in dem Apache-Logs war immer 127.0.0.1. "Libapache2-mod-rpaf" Installation schien es zu beheben. Ich habe keine Ahnung, ob das Problem in Zusammenhang steht.

Add "fastcgi_param REMOTE_ADDR $ remote_addr;" zur nginx.conf-Datei:

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

Quelle: wie virtuelle Server + nginx fcgi für django

Für mich mit dem folgenden gearbeitet:

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

Das funktioniert mit django 1.4 (insbesondere localshop).

Nein, es ist nicht möglich auf remote_addr passieren. So ist die einzige Lösung, die ich kenne, ist X-Real-IP oder X-Forwarded-For und stellen Sie sicher, zu verwenden, dass das Backend verarbeitet diese korrekt.

Edit: dies gilt für fastcgi_pass, nicht regelmäßig nginx proxy_pass

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top