#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)