11
votes

Remote_addr ne pas être envoyé à Django avec Nginx & Tornado

J'ai donc obtenu une installation simple avec Nginx pour un support statique et un équilibrage de charge et de la Tornado en tant que WebServer pour Django (4 serveurs fonctionnant). Mon problème est à Remote_Addr de ne pas être transmis à Django, donc je reçois un keyError:

Article.ip = Demande.Meta ['Remote_addr']

L'adresse distante est envoyé à travers comme x-réel-ip (http_x_real_ip) grâce au nginx.conf: xxx

car http est achète à la touche méta, je ne peux pas simplement faire proxy_set_header Remote_addr $ Remote_addr. Ce que je pourrais faire est de lire le X-Real-IP si aucune clé de démarrage à distance n'est trouvée, mais je suis curieux s'il y a une solution plus intelligente.

Merci!


2 commentaires

Ce n'est pas la solution correcte, mais j'ai ajouté un middleware Django qui a transformé http_x_real_ip en Remote_Addr.


Ces déclarations vous aideront: proxy_redirect Off; proxy_set_header X-Real-IP $ Remote_addr; proxy_set_header x-transféré-for $ proxy_add_x_forwarded_for; proxy_set_header x-schéma $ Schéma;


6 Réponses :


5
votes

J'ai une configuration similaire. Après avoir mis Nginx devant Apache, j'ai remarqué que l'IP dans les journaux Apache était toujours 127.0.0.1. L'installation de «libapache2-mod-rpaf» semblait la réparer. Je n'ai aucune idée si votre problème est lié.


1 commentaires

Merci pour votre réponse. BTW: Cela aide également le logiciel PHP, qui repose sur $ _Server ['Remote_addr'] qui contient également la vraie IP à distance.



2
votes

Non, c'est non possible pour transmettre à distance_addr. Donc, la seule solution que je connaisse est d'utiliser X-Real-IP ou X-Forwarded - pour et assurez-vous que le backend les gère correctement.

EDIT: Ceci s'applique à fastcgi_pass, non régulier NGinx Proxy_Pass


2 commentaires

À un gestionnaire FastCGI, oui. Mais la question portait sur un proxy Nginx.


Oups, j'aurais dû lire plus près - proxy_pass n'est pas fastcgi_pass . Je ne peux pas abroger mon bowvote à moins que vous n'ayez modifié votre réponse, apparemment. : / Si vous deviez le modifier, je serais heureux de uppoter à la place.



17
votes

Voici comment j'ai résolu le problème. En utilisant ce middleware: xxx

espère que cela aide!


3 commentaires

Seul problème avec ceci est que si vous laissez tomber en silence l'erreur, vous découvrirez que vous découvrirez un serveur Web malconmisé plus tard (avec des informations potentiellement perdues ou des utilisateurs incapables de vous connecter). Ma suggestion serait d'échouer ou de loger au moins l'erreur.


Presque toujours, vous ne voulez pas ESSAY / SAUF: SANS TYPE D'EXCEPTION SUR CPPHON 2.X, car il attrape également SystemExit, clavierInterrupt et generatorexit - ce sont toutes des erreurs que vous préférez partir Seul ou, dans de rares cas, attrapez-les séparément. En particulier dans ce cas, on devrait attraper KeyError. Mais alors vous pouvez en outre rendre tout ce code encore plus simple: demande.meta.setdefault ('Remote_addr', demande.meta.get ('http_x_real_ip', '1.1.1.1'))


Belle solution mais garder à l'esprit HAS_KEY () a été supprimé à Python 3.x. Utilisation: Si non request.meta.get ('Remote_addr', aucune):



5
votes

Ajouter "FastCGI_PARAM REMOTE_ADDR $ REMOTE_ADDR;" au fichier nginx.conf: xxx

source: Comment faire des serveurs virtuels Nginx + FCGI pour Django?


2 commentaires

Cela fonctionne génial pour fastcgi_pass (merci!), Mais cela ne fonctionnera pas pour proxy_pass , qui est la configuration de l'OP (voir la réponse @windyjonas).


Comment - fastcgi_param remote_addr $ http_x_real_ip; ? Si X-Real-IP est disponible pour NGinx, il peut être utilisé pour transmettre comme fastcgi_param. Cela éliminera la nécessité de modifier les codes source d'application.



2
votes

Pour moi, en utilisant les suivants travaillés: xxx

Ceci fonctionne avec Django 1.4 (spécifiquement, localShop).


0 commentaires

14
votes

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


1 commentaires

Selon ceci: easyEngine.io/Tutorials/nginx/forwarding-Visitors-Real- IP Intérieur Backend-Nginx Conf: Emplacement ~ \ .php $ {fastcgi_param Remote_addr $ http_x_real_ip; # ... Autres règles}