Получение общедоступного адреса приложения django

#python #django #nginx

#python #django #nginx

Вопрос:

У меня есть приложение django, прослушивающее 127.0.0.1 и доступное через nginx.

Каковы мои варианты для получения информации об общедоступном IP (тех, которые используют клиенты) из приложения django?

В настоящее время я делаю:

 def get_local_ip(request):
    """Return the local IP (where the application is listening to)"""
    # TODO: this should be the server IP as seen by the UI (the public IP, where nginx is listening)
    return request.META.get('HTTP_HOST') if request else None
  

Но это возвращает 127.0.0.1 .

Ответ №1:

В вашей конфигурации nginx необходимо добавить это в заголовки, не уверен, что это сделано по умолчанию. $server_addr — это тот, который вам нужно добавить в заголовки, поэтому в вашей конфигурации nginx вам нужно будет добавить (при условии, что вы используете обратный прокси):

 proxy_set_header X-Server-IP $server_addr;
  

И затем в вашем get_local_ip методе вы сможете получить доступ к этому заголовку с помощью:

 return request.META.get('HTTP_X_SERVER_IP')
  

Обратите внимание, что если ваш сервер nginx находится за балансировщиком нагрузки, это все равно не будет адресом, который «видят» ваши пользователи, поскольку они видят IP-адрес вашего балансировщика нагрузки. Адрес, который они видят, является:

 import socket
ip_address = socket.gethostbyname(request.META.get('SERVER_NAME'))
  

который просто разрешает ваше доменное имя с помощью DNS (и может замедлить ваш запрос, поскольку необходимо выполнить поиск в DNS, в зависимости от TTL, который вы установили в своих записях DNS)