Nginx GeoIP: geoip_proxy при работе за прокси или балансировщиком
Настройка geoip_proxy и geoip_proxy_recursive, чтобы GeoIP смотрел на реальный IP клиента из X-Forwarded-For, а не на IP прокси.
Как использовать
- Узнать подсеть прокси/балансировщика (например, Cloudflare или внутренний ELB).
- В http {} добавить geoip_proxy с этой подсетью и включить geoip_proxy_recursive on.
- Перезагрузить конфиг: nginx -t && systemctl reload nginx.
Когда Nginx стоит за прокси (Cloudflare, балансировщик, другой reverse proxy), переменные GeoIP по умолчанию берутся от IP соединения — то есть от прокси. Чтобы использовать IP клиента из заголовка X-Forwarded-For, нужны директивы geoip_proxy и geoip_proxy_recursive. Описание: ngx_http_geoip_module.
Базовая настройка в http {}
Укажите подсеть доверенного прокси и включите рекурсивный разбор X-Forwarded-For:
http {
geoip_country /etc/nginx/geoip/GeoIP.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat;
# Подсеть прокси/балансировщика — подставьте свою
geoip_proxy 10.0.0.0/8;
geoip_proxy_recursive on;
# ...
}
geoip_proxy— один или несколько адресов/подсетей; для запросов с такого IP Nginx будет брать клиентский адрес изX-Forwarded-For.geoip_proxy_recursive on— перебор цепочки в X-Forwarded-For до первого «недоверенного» IP (обычно это IP клиента).
Пример для нескольких подсетей
http {
geoip_proxy 172.16.0.0/12;
geoip_proxy 192.168.1.0/24;
geoip_proxy_recursive on;
# ...
}
Диапазоны замените на реальные подсети вашего прокси или балансировщика. После правок: nginx -t, затем systemctl reload nginx.
Подробнее: Как включить GeoIP в Nginx: переменные для логов и заголовков.