Настройка GeoDNS и гео-маршрутизации
GeoDNS направляет пользователей на ближайший сервер на уровне DNS-разрешения, до установки TCP-соединения. Это снижает latency и позволяет разделять трафик по географическим зонам.
Провайдеры GeoDNS
Cloudflare Load Balancing — geo-steering из коробки:
# Cloudflare API: создание Load Balancer
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/load_balancers" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
--data '{
"name": "api.mysite.com",
"fallback_pool": "us-east-1-pool",
"default_pools": ["us-east-1-pool"],
"region_pools": {
"ENAM": ["us-east-1-pool"],
"WNAM": ["us-west-2-pool"],
"EEU": ["eu-central-1-pool"],
"WEU": ["eu-west-1-pool"],
"SEAS": ["ap-southeast-1-pool"],
"NEAS": ["ap-northeast-1-pool"]
},
"steering_policy": "geo",
"session_affinity": "ip_cookie",
"session_affinity_ttl": 300
}'
AWS Route 53 Geolocation Routing:
# Terraform
resource "aws_route53_record" "api_eu" {
zone_id = var.zone_id
name = "api.mysite.com"
type = "A"
set_identifier = "eu-users"
geolocation_routing_policy {
continent = "EU"
}
alias {
name = aws_lb.eu_west_1.dns_name
zone_id = aws_lb.eu_west_1.zone_id
evaluate_target_health = true
}
}
resource "aws_route53_record" "api_default" {
zone_id = var.zone_id
name = "api.mysite.com"
type = "A"
set_identifier = "default"
geolocation_routing_policy {
country = "*" # Default: все остальные регионы
}
alias {
name = aws_lb.us_east_1.dns_name
zone_id = aws_lb.us_east_1.zone_id
evaluate_target_health = true
}
}
AWS Route 53 Latency-based Routing (рекомендуется вместо geolocation):
# Route трафик не по географии, а по реальной задержке
resource "aws_route53_record" "api_latency_eu" {
zone_id = var.zone_id
name = "api.mysite.com"
type = "A"
set_identifier = "eu-west-1"
latency_routing_policy {
region = "eu-west-1"
}
alias {
name = aws_lb.eu.dns_name
zone_id = aws_lb.eu.zone_id
evaluate_target_health = true
}
}
Nginx: гео-маршрутизация на уровне приложения
Для тонкой настройки — MaxMind GeoIP2:
# Установка модуля
apt install nginx-module-geoip2 libmaxminddb-dev
# Скачать базу GeoLite2
mkdir -p /etc/nginx/geoip
cd /etc/nginx/geoip
curl -L "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key={KEY}&suffix=tar.gz" \
| tar xz --strip-components=1
# nginx.conf
load_module modules/ngx_http_geoip2_module.so;
http {
geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
$geoip2_country_code country iso_code;
$geoip2_country_name country names en;
}
# Маппинг стран на бэкенды
map $geoip2_country_code $backend {
default http://us-backend:3000;
RU http://ru-backend:3000;
UA http://eu-backend:3000;
"~^(DE|AT|CH)" http://eu-backend:3000;
"~^(GB|IE|FR)" http://eu-backend:3000;
}
# Маппинг для перенаправления на языковую версию
map $geoip2_country_code $lang_prefix {
default /en;
RU /ru;
UA /ua;
DE /de;
}
server {
listen 80;
location / {
# Автоматический редирект по гео (только для первого визита)
if ($cookie_lang_set = "") {
return 302 $lang_prefix$request_uri;
}
proxy_pass $backend;
proxy_set_header X-Country-Code $geoip2_country_code;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
Проверка GeoDNS
# Проверка с разных резолверов (имитация разных регионов)
dig @8.8.8.8 api.mysite.com # Google DNS (US)
dig @1.1.1.1 api.mysite.com # Cloudflare (EU)
dig @77.88.8.8 api.mysite.com # Яндекс DNS (RU)
# Через curl с имитацией геолокации (через VPN или proxy)
curl -v https://api.mysite.com/health
# Cloudflare trace
curl https://mysite.com/cdn-cgi/trace | grep colo
# colo=AMS → Amsterdam PoP
# Проверка IP геолокации
curl https://ipapi.co/{IP}/json/ | jq '.country_code, .region'
TTL и кэширование DNS
При GeoDNS важно правильно настроить TTL:
TTL = 30s → быстрый failover, высокая нагрузка на NS-серверы
TTL = 300s → хороший баланс (рекомендуется)
TTL = 3600s → снижает нагрузку на DNS, медленный failover
Cloudflare Load Balancing автоматически управляет TTL при failover.
Настройка GeoDNS через Cloudflare с двумя регионами — 1–2 рабочих дня. Через AWS Route 53 с Terraform — 2–3 дня.







