geo и map

Тема дорожной карты · Nginx

Модули geo и map в Nginx — взаимодополняющие инструменты конфигурации для получения новых значений переменных из существующих, позволяющие реализовывать условную маршрутизацию, ограничение скорости и управление трафиком без логики на уровне приложения. Блок geo сопоставляет IP-адреса клиентов (используя $remote_addr или $http_x_forwarded_for) с пользовательскими значениями переменных — например, geo $country { default 0; 10.0.0.0/8 1; } — что упрощает реализацию IP-контроля доступа или географически зависимой балансировки нагрузки на веб-сервере. Модуль map более универсален: map $uri $cache_ttl { default 10m; ~*/api/ 0; } преобразует любую переменную Nginx в другое значение на основе точных совпадений, регулярных выражений или шаблонов с подстановочными знаками, а полученная переменная может затем управлять решениями proxy_cache_valid, limit_req_zone или proxy_pass. Оба блока — geo и map — должны быть размещены в контексте http файла /etc/nginx/nginx.conf и вычисляются лениво — только когда производная переменная реально используется — поэтому они создают минимальные накладные расходы производительности даже при больших таблицах сопоставления. Комбинирование директив geo и map — мощный декларативный подход к построению сложных правил обратного прокси и балансировки нагрузки Nginx, остающихся полностью в пределах уровня конфигурации.

Как это работает

geo и map использует модули limit_req и limit_conn. Определите зону (limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;) и примените (limit_req zone=mylimit burst=20 nodelay;). binary_remote_addr ключует по IP (мало места); используйте $http_x_forwarded_for за load balancer. limit_conn ограничивает конкурентные соединения. Комбинируйте с fail2ban для IP-blocking постоянных нарушителей; с WAF (ModSecurity, naxsi) для L7-атак.

Когда применять

Rate limit на login-эндпойнты с первого дня (5 req / 15 min на IP). Лимит общего трафика на IP против скрейпинга (100 req/s burst 200). Разные зоны на endpoint-паттерн (/api/expensive — 1 req/s; /api/cheap — 100 req/s). За load balancer всегда forwarded-for IP, никогда LB IP.

Типичные ошибки

Ловушки geo и map: rate limit по source IP за CDN/load balancer, скрывающим реальный client IP (все упираются в лимит IP LB); burst слишком низкий (легитимные всплески упираются в лимит); не возвращают нормальный 429 с Retry-After (клиенты долбят эндпойнт); rate-limit аутентифицированных юзеров по IP, когда они делят офисный NAT.

Связанные понятия

Полезные ресурсы