Настройка 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):
# Маршрутизація трафіку не по географії, а по реальній затримці
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 дні.







