У меня есть экземпляр nginx, настроенный за несколькими прокси-серверами балансировки нагрузки, и я использую real_ip
чтобы получить IP-адрес клиентов в remote_addr для обработки моим приложением Python.
Однако в своих журналах я хотел бы записать прокси-сервер, который действительно сделал запрос, но $remote_addr
теперь перезаписан, и я не могу найти ничего, что говорило бы о том, что была сделана его копия.
Как я смогу это сделать?
Ваши настройки могли измениться с тех пор, как вы разместили этот вопрос, но у меня была та же проблема, и, наконец, доступно решение. Я размещу его здесь на случай, если Google привлечет на эту страницу кого-нибудь еще.
Как указывает @Michael Hampton ♦ в своем ответ к моя собственная версия этого вопроса, nginx добавил переменную $realip_remote_addr
к Модуль Real_IP. Он содержит исходное значение $remote_addr
, что позволяет вам использовать / регистрировать как исходный IP-адрес клиента, так и IP-адрес сервера, который отправил фактический запрос в nginx. Это было добавлено в версию 1.9.7 в ноябре 2015 года.
Не понимаю, хотите ли вы войти на стороне nginx или внутри своего приложения>
Для стороны nginx вы можете использовать $ http_x_forwarded_for в определении nginx log_format, примерно так:
log_format main '$remote_addr - $remote_user [$time_local] [$msec] [$request_time] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
Сам модуль не поддерживает этого. Однако обратные прокси (для которых в основном используется real_ip) могут предоставлять поле заголовка HTTP, содержащее IP-адрес прокси.
К сожалению, вы не можете проверить, был ли адрес переписан или нет, поэтому клиент, не подключающийся через прокси-сервер с поддержкой real_ip, может подделать поле заголовка.
Проверьте документ своего прокси, возможно, вы можете использовать поле заголовка HTTP для IP-адреса.