So I got a simple setup with nginx for static media and load balancing and tornado as webserver for django (4 servers running). My problem is remote_addr not getting passed on to django so I'm getting a KeyError:
article.ip = request.META['REMOTE_ADDR']
The remote address is getting sent through as X-Real-IP (HTTP_X_REAL_IP) thanks to the 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;
}
As HTTP is prepended to the META key I can't just do proxy_set_header remote_addr $remote_addr. What I could do is read the X-Real-IP if no remote addr key is found but I'm curious if there's a smarter solution.
Thanks!
For me, using the following worked:
This works with django 1.4 (specifically, localshop).
Try this one:
Just add
proxy_set_header REMOTE_ADDR
and it should be work well.Tried with:
No, it's not possible to pass on remote_addr. So the only solution that I know of is to use X-Real-IP or X-Forwarded-For and make sure that the backend handles these correctly.
Edit: this applies to fastcgi_pass, not regular nginx proxy_pass
I have a similar setup. After putting nginx in front of apache, I noticed that the IP in the apache logs was always 127.0.0.1. Installing "libapache2-mod-rpaf" seemed to fix it. I have no idea if your problem is related.
Here's how I solved the problem. By using this middleware:
Hope that helps!
Add "fastcgi_param REMOTE_ADDR $remote_addr;" to the nginx.conf file:
Source: how to nginx virtual servers + fcgi for django?