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:
L'adresse distante est envoyé à travers comme x-réel-ip (http_x_real_ip) grâce au nginx.conf: p> 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. P> Merci! P> P> Article.ip = Demande.Meta ['Remote_addr'] Code> P>
6 Réponses :
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é. P>
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.
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. P>
EDIT: Ceci s'applique à fastcgi_pass, non régulier NGinx Proxy_Pass P>
À un gestionnaire FastCGI, oui. Mais la question portait sur un proxy Nginx.
Oups, j'aurais dû lire plus près - proxy_pass code> n'est pas
fastcgi_pass code>. 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.
Voici comment j'ai résolu le problème. En utilisant ce middleware: espère que cela aide! P> p>
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: CODE> 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')) code>
Belle solution mais garder à l'esprit HAS_KEY () a été supprimé à Python 3.x. Utilisation: Si non request.meta.get ('Remote_addr', aucune):
Ajouter "FastCGI_PARAM REMOTE_ADDR $ REMOTE_ADDR;" au fichier nginx.conf: source: Comment faire des serveurs virtuels Nginx + FCGI pour Django? P> P>
Cela fonctionne génial pour fastcgi_pass code> (merci!), Mais cela ne fonctionnera pas pour
proxy_pass code>, qui est la configuration de l'OP (voir la réponse @windyjonas).
Comment - fastcgi_param remote_addr $ http_x_real_ip; code>? 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.
Pour moi, en utilisant les suivants travaillés: Ceci fonctionne avec Django 1.4 (spécifiquement, localShop). P> P>
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; }
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}
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;