REMOTE_ADDR ne sera pas envoyé à Django avec nginx & tornado

J’ai donc eu une installation simple avec nginx pour les médias statiques et l’équilibrage de charge et tornado en tant que serveur web pour django (4 serveurs en cours d’exécution). Mon problème est que remote_addr ne soit pas transmis à django alors je reçois une erreur de clé:

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

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

Comme 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 de lire le X-Real-IP si aucune clé d’addr distante n’est trouvée, mais je suis curieux de savoir s’il existe une solution plus intelligente.

Merci!

Essaye celui-là:

 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 cela devrait bien fonctionner.

Essayé avec:

  • Django 1.5.4
  • Nginx 1.4.3
  • Tornade 2.2.1

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 cela pourra aider!

J’ai une configuration similaire. Après avoir mis nginx devant Apache, j’ai remarqué que l’adresse IP dans les journaux Apache était toujours 127.0.0.1. L’installation de “libapache2-mod-rpaf” semblait résoudre le problème. Je n’ai aucune idée 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_ssortingng; 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, en utilisant les suivants:

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

Cela fonctionne avec django 1.4 (spécifiquement, localshop).

Non, il n’est pas possible de transmettre remote_addr. La seule solution que je connaisse consiste à utiliser X-Real-IP ou X-Forwarded-For et à vérifier que le backend les gère correctement.

Edit: ceci s’applique à fastcgi_pass, pas régulier nginx proxy_pass