Question

J'ai donc eu une configuration simple avec nginx pour les médias statiques et l’équilibrage de la charge, ainsi que tornado en tant que serveur Web pour Django (4 serveurs en fonctionnement). Mon problème est que remote_addr ne soit pas transmis à django, je reçois donc une erreur KeyError:

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

L'adresse distante est envoyée via X-Real-IP (HTTP_X_REAL_IP) grâce au fichier 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;
    }

Puisque HTTP est ajouté à la clé META, je ne peux pas faire simplement proxy_set_header remote_addr $ remote_addr. Ce que je pourrais faire, c’est lire le X-Real-IP si aucune clé d’adresse distante n’est trouvée, mais je suis curieux de savoir s’il existe une solution plus intelligente.

Merci!

Était-ce utile?

La solution

Essayez celui-ci:

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

Ajoutez simplement proxy_set_header REMOTE_ADDR et tout devrait bien fonctionner.

Essayé avec:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornado 2.2.1

Autres conseils

Voici comment j'ai résolu le problème. En utilisant ce 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

J'espère que ça aide!

J'ai une configuration similaire. Après avoir placé nginx devant apache, j’ai remarqué que l’IP dans les journaux d’apache était toujours de 127.0.0.1. Installation de & libapache2-mod-rpaf " semblait le réparer. Je ne sais pas si votre problème est lié.

Ajouter "fastcgi_param REMOTE_ADDR $ remote_addr; " dans le fichier 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;
    ...
}

Source: comment nginx serveurs virtuels + fcgi pour django? <

Pour moi, utiliser les éléments suivants a fonctionné:

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

Ceci fonctionne avec django 1.4 (en particulier, localshop).

Non, il est impossible de transmettre à remote_addr. Donc, la seule solution que je connaisse consiste à utiliser X-Real-IP ou X-Forwarded-For et à vous assurer que le serveur gère ces informations correctement.

Éditer: cela s'applique à fastcgi_pass, pas à nginx proxy_pass normal

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top