MMM
MMM

Reputation: 39

How can I get public ip address in Django with Nginx as http server and gunicorn?

I want to get public IP address of clients but I just get 127.0.0.1 almost always. I tested some solution, but no right answer found with my configuration (Django, Nginx and Gunicorn)

Here is my Nginx proxy config.

location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
}

Upvotes: 2

Views: 3361

Answers (1)

Michel Sabchuk
Michel Sabchuk

Reputation: 840

First, you should make nginx pass the client's remote address to the upstream server (gunicorn):

server {
  location / {
    proxy_pass http://proxy_addr;
    proxy_set_header X-Real-IP $remote_addr;
   }
}

Then you can access the remote addr in the django request's META like this:

ip_address = request.META["HTTP_X_REAL_IP"]

Note that you can use also dict.get to avoid a KeyError while running runserver:

ip_address = request.META.get("HTTP_X_REAL_IP")

Upvotes: 3

Related Questions