Rete
Crea una CDN Anycast
Crea una CDN Anycast con BIRD e NGINX: ottieni un /24, memorizza HTTPS in cache, verifica il failover e aggiungi pool Anycast regionali con GeoDNS.
Per creare una CDN Anycast, annuncia lo stesso prefisso IP da più sedi ed esegui una cache HTTPS in ciascuna. Useremo BIRD per BGP e NGINX per la cache, poi mostreremo come raggruppare i nodi edge in pool Anycast regionali selezionati da GeoDNS.
Scegli Anycast globale oppure Anycast regionale con GeoDNS
Anycast globale usa un unico IP di servizio su tutti i nodi edge. Il DNS restituisce quell'IP; BGP seleziona il nodo ricevente secondo la politica di rete e i percorsi disponibili. Un cache hit viene servito lì. Un cache miss raggiunge l'origine e può popolare la cache di quel nodo.
Anycast regionale con GeoDNS aggiunge un passaggio di selezione. Ogni pool regionale ha un IP di servizio diverso, condiviso dai suoi nodi edge. GeoDNS restituisce un IP regionale; BGP seleziona un nodo che lo annuncia. Questo permette di scegliere un pool regionale prima che l'instradamento internet scelga il server.
| Scelta di instradamento | Anycast globale | Anycast regionale + GeoDNS |
|---|---|---|
| Risposta DNS | Lo stesso IP CDN per tutti. | Un IP CDN diverso per ogni pool regionale selezionato. |
| Annunci BGP | Tutti i nodi edge annunciano lo stesso prefisso. | I nodi edge di ogni pool annunciano il prefisso del pool. |
| Un nodo edge si guasta | Ritira la sua rotta; gli altri nodi edge che la annunciano rimangono disponibili. | Ritira la sua rotta; un altro nodo edge dello stesso pool può ricevere nuove connessioni. |
| Un'intera regione diventa indisponibile | Un'altra regione che annuncia la rotta può ricevere il traffico dopo la convergenza. | Il DNS deve selezionare un pool di fallback sano. Le risposte DNS in cache possono ancora puntare al pool guasto. |
| Sceglilo quando | Vuoi un IP stabile e un unico pool globale. | Vuoi selezionare esplicitamente i pool regionali, separare la capacità o usare origini regionali diverse. |
DNS selects an IP; BGP selects an edge; NGINX serves or fills the cache
GLOBAL ANYCAST
cdn.example.com -> one IP -> BGP -> Paris or New York cache
|
cache miss
v
origin
REGIONAL ANYCAST + GEODNS
cdn.example.com -> GeoDNS -> Europe IP -> BGP -> Paris / Frankfurt
-> US IP -> BGP -> New York / Chicago
-> default -> chosen fallback poolCosa serve per la prima configurazione
Inizia dalla configurazione globale: due server Debian 12 appena installati con systemd, BIRD 2, NGINX e BGP per i clienti; un IPv4 /24 autorizzato e un ASN di origine concordato; un'origine HTTPS su un IP separato; un dominio di cui controlli il DNS. Gli esempi presuppongono peer BGP diretti. L'upstream deve fornire i valori reali del peering.
Prevedi i costi per spazio di indirizzi e accordi ASN, entrambi i server edge, traffico in uscita, traffico verso l'origine, verifiche dello stato DNS e monitoraggio. Richiedi preventivi aggiornati e conferma l'idoneità a BGP prima di ordinare. Gli indirizzi sotto sono esempi riservati alla documentazione: sostituiscili con i tuoi. I tempi di distribuzione e di guasto devono essere misurati sulla tua rete.
Ottieni un /24 e il permesso di annunciarlo
Per annunciare i tuoi indirizzi IPv4 su internet pubblico, /24 è la dimensione minima pratica del blocco: 256 indirizzi. Un prefisso più lungo indica un blocco più piccolo: /25 contiene 128 indirizzi e /26 ne contiene 64. Questi blocchi più piccoli vengono comunemente filtrati. Prima di acquistare o noleggiare il blocco, conferma che entrambe le sedi di hosting supportino BGP per i clienti e accettino il tuo prefisso.
Puoi noleggiare un blocco con il tuo ASN, richiedere spazio a un provider, fare richiesta direttamente a un registro o acquistare un blocco esistente dal titolare.
| Route | Cosa fare | Verifica prima di procedere |
|---|---|---|
| Noleggia un blocco con il tuo ASN | Noleggia un /24 e fai autorizzare il tuo ASN a originarlo dal titolare. Procurati l'ASN separatamente se non ne hai già uno. | Conferma gli aggiornamenti ROA e IRR, il permesso di annunciare da entrambi i PoP e le condizioni di rinnovo e uscita dal noleggio. |
| Richiedi un blocco assegnato dal provider | Chiedi a un provider come Vultr uno spazio di indirizzi che possa instradare per la tua configurazione BGP nelle località necessarie. | Conferma che sia disponibile un /24 completo, quale ASN lo origina e se puoi annunciarlo fuori dalla rete del provider. |
| Richiedi direttamente a un registro | Richiedi un'assegnazione al tuo registro internet regionale. RIPE NCC ha una lista d'attesa /24 per i LIR idonei che non hanno mai ricevuto un'assegnazione IPv4. | È un'assegnazione soggetta alla politica del registro. Pagare le quote di adesione non garantisce un blocco né una data di consegna. |
| Acquista un blocco esistente | Acquista da un titolare che vende il proprio blocco, direttamente o tramite broker o marketplace, poi completa il processo di trasferimento del registro. | Prima di pagare, verifica il diritto del venditore a cedere il blocco, l'idoneità al trasferimento, i costi, la cronologia di instradamento e abusi e l'accettazione da parte dell'upstream. |
Rendi il blocco instradabile
Concorda l'ASN di origine con i tuoi upstream. Se ti serve un ASN proprio, richiedilo al registro regionale o tramite un provider sponsor secondo i requisiti di quel registro. L'ASN identifica la rete che origina il tuo prefisso; è distinto dal noleggio o dal trasferimento degli indirizzi.
Fai autorizzare quell'ASN in RPKI dal titolare della risorsa: crea un ROA per il /24 con lunghezza massima /24. Aggiungi il corrispondente oggetto route IRR dove richiesto dall'upstream e fornisci una lettera di autorizzazione se richiesta. Un ROA autorizza l'instradamento; non annuncia la rotta al posto tuo.
Invia questa richiesta a entrambi i provider di hosting. Non iniziare la configurazione dei server finché non confermano che il prefisso è accettato e non forniscono le impostazioni dei peer.
Information to exchange with each upstream
Our prefix: [your /24]
Our origin ASN: [your ASN]
Locations: Paris and New York, announced simultaneously
Please confirm:
- Prefix accepted; required ROA, IRR record, and authorization
- Peer IP, peer ASN, local source IP, and any BGP password
- Direct or multihop peering
- Replies sourced from our /24 are allowed
- Global export policy and available regional communitiesPrepara il primo server edge
Metteremo il primo nodo edge a Parigi e il secondo a New York. Ogni sede è un punto di presenza, o PoP. Entrambi ricevono lo stesso IP CDN; ciascuno mantiene il proprio indirizzo unicast per SSH e richieste all'origine.
Sostituisci tutti gli indirizzi, gli ASN e i nomi example.com sotto. Sono valori di documentazione, non indirizzi che puoi annunciare. L'esempio presuppone peer BGP collegati direttamente; usa le impostazioni multihop del provider se necessarie.
Address plan
cdn.example.com → 203.0.113.80
|
BGP chooses a PoP
/ \
Paris cache New York cache
\ /
cache misses
|
origin.example.com
192.0.2.10:443
Prefix: 203.0.113.0/24
CDN IP on BOTH PoPs: 203.0.113.80/32
Origin ASN: 64496
Upstream ASN: 64497
Paris node / peer: 198.51.100.10 / 198.51.100.1
New York / peer: 198.51.100.20 / 198.51.100.17Installa i pacchetti e associa l'indirizzo CDN
Esegui questo a Parigi. Il /32 associa localmente l'indirizzo CDN; la rotta blackhole che copre il prefisso scarta i pacchetti per gli indirizzi inutilizzati del /24. L'unità systemd sotto ripristina entrambi dopo un riavvio, prima dell'avvio di BIRD e NGINX.
Consenti HTTPS verso l'IP CDN e BGP sulla porta TCP 179 dal peer del provider. Mantieni l'accesso di gestione sull'indirizzo unicast. Questa configurazione di reverse proxy non richiede l'inoltro di pacchetti Linux.
Paris shell
sudo apt-get update
sudo apt-get install -y bird2 nginx curl ca-certificates iproute2 python3
sudo install -d -o www-data -g www-data /var/cache/nginx/cdnMantieni l'indirizzo dopo i riavvii
Salva questa unità con il tuo IP di servizio e il tuo prefisso reali. Aggiunge un'interfaccia dummy dedicata e conserva la configurazione unicast esistente del server.
/etc/systemd/system/cdn-address.service
[Unit]
Description=CDN service address
Before=bird.service nginx.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=-/usr/sbin/ip link add anycast0 type dummy
ExecStart=/usr/sbin/ip address replace 203.0.113.80/32 dev anycast0
ExecStart=/usr/sbin/ip link set anycast0 up
ExecStart=/usr/sbin/ip route replace blackhole 203.0.113.0/24
[Install]
WantedBy=multi-user.targetOrdina l'avvio dei servizi dopo la configurazione dell'indirizzo
Aggiungi la dipendenza a entrambi i servizi, avvia l'unità dell'indirizzo e verifica la rotta verso l'origine. Deve usare la rete unicast, non anycast0.
Paris shell
for service in bird nginx; do
sudo mkdir -p /etc/systemd/system/$service.service.d
sudo tee /etc/systemd/system/$service.service.d/cdn-address.conf >/dev/null <<'EOF'
[Unit]
Requires=cdn-address.service
After=cdn-address.service
EOF
done
sudo systemctl daemon-reload
sudo systemctl enable --now cdn-address
ip address show dev anycast0
ip route get 192.0.2.10Configura BIRD per annunciare il /24
Salva questo file come /etc/bird/bird.conf a Parigi. Il filtro di esportazione permette solo il tuo /24. Il protocollo statico parte disabilitato, quindi il server non annuncia nulla finché HTTPS non funziona. BIRD mantiene questa rotta nella propria tabella di instradamento; la rotta blackhole Linux è stata configurata separatamente sopra.
/etc/bird/bird.conf
router id 198.51.100.10;
protocol device {
scan time 10;
}
protocol static cdn_prefix {
disabled yes;
ipv4;
route 203.0.113.0/24 blackhole;
}
filter export_cdn {
if net = 203.0.113.0/24 then accept;
reject;
}
protocol bgp transit {
local as 64496;
source address 198.51.100.10;
neighbor 198.51.100.1 as 64497;
graceful restart off;
ipv4 {
import none;
export filter export_cdn;
};
}Verifica la sessione BGP
Aggiungi l'autenticazione o le impostazioni multihop richieste dal provider prima di avviare. Lo stato atteso è Established, senza alcun prefisso CDN esportato per il momento. Se la sessione rimane inattiva, verifica indirizzo del peer, ASN, firewall e autenticazione con il tuo upstream.
Validate and load the configuration
sudo bird -p -c /etc/bird/bird.conf
sudo systemctl enable --now bird
sudo birdc configure
sudo birdc show protocols all transit
sudo birdc show route export transitEmetti i certificati HTTPS
Usa DNS-01 per emettere il certificato CDN prima di annunciare l'IP. Ecco un esempio Certbot per una zona ospitata su Cloudflare DNS. Usa il plugin DNS Certbot corrispondente se la zona è altrove. Il proxy Cloudflare rimane disattivato per il record CDN.
Crea un token API DNS limitato alla zona necessaria con il permesso Zone:DNS:Edit. Su ogni nodo edge, salvalo come dns_cloudflare_api_token = YOUR_TOKEN in /root/.secrets/cloudflare.ini, con permessi 700 per la directory e 600 per il file. Emetti i certificati sui due nodi uno alla volta e tieni le credenziali fuori dal controllo di versione.
Run on each edge; replace the hostname and email
sudo apt-get install -y certbot python3-certbot-dns-cloudflare
sudo install -d -m 700 /root/.secrets
sudo touch /root/.secrets/cloudflare.ini
sudo chmod 600 /root/.secrets/cloudflare.ini
sudoedit /root/.secrets/cloudflare.ini
sudo certbot certonly --dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/cloudflare.ini \
--dns-cloudflare-propagation-seconds 60 \
--cert-name cdn.example.com -d cdn.example.com \
--email ops@example.com --agree-tos --non-interactiveRicarica NGINX dopo il rinnovo
Quando la configurazione NGINX sottostante supera nginx -t, installa questo hook di distribuzione e verifica il timer di rinnovo su ogni nodo edge. Certificati indipendenti possono servire lo stesso hostname senza condividere una chiave privata. Con la crescita dei nodi, centralizza emissione e distribuzione sicura per ridurre l'esposizione delle credenziali DNS e coordinare i rinnovi.
Enable renewal after configuring NGINX
sudo install -d /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx >/dev/null <<'EOF'
#!/bin/sh
set -eu
/usr/sbin/nginx -t
/usr/bin/systemctl reload nginx
EOF
sudo chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-nginx
sudo systemctl enable --now certbot.timer
sudo certbot renew --dry-run --run-deploy-hooks
systemctl list-timers certbot.timerConfigura HTTPS e la cache edge
Usa l'IP separato dell'origine in cdn_origin e l'hostname del suo certificato in proxy_ssl_name. All'origine, servi /assets/logo.v1.svg con Cache-Control: public, max-age=60, s-maxage=300 e un ETag. Servi anche /cdn-probe.txt con il corpo origin-ok e Cache-Control: no-store.
Salva questa configurazione completa in /etc/nginx/conf.d/cdn.conf, incluso nel blocco http di NGINX. Memorizza in cache soltanto /assets/. Gli altri percorsi vanno direttamente all'origine.
/etc/nginx/conf.d/cdn.conf
proxy_cache_path /var/cache/nginx/cdn
levels=1:2 keys_zone=cdn:50m max_size=10g
inactive=60m use_temp_path=off;
map "$http_authorization$http_cookie" $skip_private {
default 1;
"" 0;
}
upstream cdn_origin {
server 192.0.2.10:443;
keepalive 32;
}
server {
listen 203.0.113.80:443 ssl;
server_name cdn.example.com;
ssl_certificate /etc/letsencrypt/live/cdn.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cdn.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
if ($host != cdn.example.com) { return 421; }
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host origin.example.com;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_ssl_server_name on;
proxy_ssl_name origin.example.com;
proxy_ssl_verify on;
proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt;
proxy_ssl_verify_depth 3;
proxy_connect_timeout 3s;
proxy_read_timeout 15s;
proxy_hide_header X-Edge-Id;
proxy_hide_header X-Cache;
add_header X-Edge-Id "paris-1" always;
add_header X-Cache $upstream_cache_status always;
location = /__edge/health {
default_type text/plain;
return 200 "edge-ok\n";
}
location ^~ /assets/ {
proxy_pass https://cdn_origin;
proxy_cache cdn;
proxy_cache_key "$scheme|$host|$request_uri";
proxy_cache_methods GET HEAD;
proxy_cache_bypass $skip_private $http_cache_control $http_pragma;
proxy_no_cache $skip_private $http_cache_control $http_pragma
$upstream_http_set_cookie;
proxy_cache_lock on;
proxy_cache_revalidate on;
}
location / {
proxy_pass https://cdn_origin;
}
}Fai restituire all'origine risposte di test prevedibili
Per un'origine NGINX, aggiungi questi blocchi location al server HTTPS esistente per origin.example.com. Forniscono una risorsa memorizzabile in cache e un endpoint di verifica non memorizzato in cache senza modificare l'applicazione. Usa il certificato valido dell'origine e conferma che il suo log di accesso registri entrambi i percorsi.
Inside the origin’s HTTPS server block
location = /assets/logo.v1.svg {
default_type image/svg+xml;
add_header Cache-Control "public, max-age=60, s-maxage=300";
add_header ETag '"cdn-demo-v1"';
return 200 '<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80"><rect width="80" height="80" fill="blue"/></svg>';
}
location = /cdn-probe.txt {
default_type text/plain;
add_header Cache-Control "no-store";
return 200 "origin-ok\n";
}Cosa memorizza questa cache
La risorsa di test rimane valida nella cache condivisa per 300 secondi grazie a s-maxage. inactive=60m controlla la rimozione degli oggetti inutilizzati, non la loro validità. La chiave distingue hostname e query string. Le richieste con cookie o autorizzazione aggirano la cache; NGINX rispetta anche la gestione delle risposte private, no-store, Set-Cookie e Vary.
Ogni PoP ha una propria cache su disco. Usa URL versionati per le risorse dei rilasci. Questa configurazione non offre un'API di svuotamento globale della cache e non forza la restituzione di contenuti obsoleti quando l'origine non funziona.
Abilita il primo PoP
Esegui le due verifiche HTTPS a Parigi. --resolve si connette all'indirizzo CDN locale mantenendo l'hostname per TLS. Entrambe le richieste devono riuscire con certificati validi e i corpi attesi prima di abilitare la rotta.
Check the edge and the origin path
sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx
curl --fail --show-error --max-time 3 \
--resolve cdn.example.com:443:203.0.113.80 \
https://cdn.example.com/__edge/health
# Expected body: edge-ok
curl --fail --show-error --max-time 5 \
--resolve cdn.example.com:443:203.0.113.80 \
https://cdn.example.com/cdn-probe.txt
# Expected body: origin-okAnnuncia la rotta e configura il DNS
Dopo il superamento delle verifiche, abilita cdn_prefix e chiedi all'upstream di confermare che il /24 sia accettato e propagato. Imposta il record A dell'hostname sull'IP CDN. Usa la modalità solo DNS se il provider DNS offre anche un proxy CDN. Verifica HTTPS da una rete esterna prima di continuare.
Enable export, then create the DNS record
sudo birdc enable cdn_prefix
sudo birdc show route export transit
# DNS record, using your real hostname and IP:
# cdn.example.com. 300 IN A 203.0.113.80Aggiungi il secondo PoP
Ripeti la configurazione a New York. Mantieni uguali /24, IP CDN, ASN di origine, hostname, origine e regole di cache. Modifica i valori sotto, installa un certificato valido e supera le verifiche HTTPS locali prima di abilitare cdn_prefix. Usa l'ASN del peer e le impostazioni reali della sede se sono diversi.
| Impostazione | Parigi | New York |
|---|---|---|
| ID router BIRD | 198.51.100.10 | 198.51.100.20 |
| Indirizzo sorgente BGP | 198.51.100.10 | 198.51.100.20 |
| Peer BGP | 198.51.100.1 | 198.51.100.17 |
| NGINX X-Edge-Id | paris-1 | new-york-1 |
Conferma che entrambe le sedi servano le richieste
Lascia invariato il DNS. Verifica l'hostname pubblico da più reti ed esamina X-Edge-Id. Per controllare un PoP specifico, esegui curl --resolve su quel server stesso; usare l'IP Anycast dal portatile non può forzare Parigi o New York.
Ritira automaticamente i nodi edge non sani
Una sessione BGP attiva non significa che HTTPS funzioni. Installa il controller di controllo dello stato dell'esempio su ogni nodo edge dopo che entrambi hanno superato le verifiche locali. Il controller verifica l'IP CDN del nodo con l'hostname TLS corretto, ritira cdn_prefix dopo tre errori consecutivi e richiede 30 secondi di funzionamento continuo più una pausa minima di 60 secondi dal ritiro prima di riprendere l'annuncio.
L'unità systemd tenta il ritiro della rotta quando il controller termina, lo riavvia dopo un crash e usa un watchdog se il ciclo si blocca. Ogni ciclo rilegge lo stato del protocollo BIRD. Questi file verificano TLS locale e reattività di NGINX; monitora separatamente spazio della cache, raggiungibilità dell'origine e instradamento pubblico. Il guasto di un'origine condivisa non deve ritirare automaticamente tutti i nodi edge che possono ancora servire contenuti in cache.
Download and inspect the files before installing
curl --fail --show-error --remote-name \
https://adios.dev/examples/anycast-cdn/edge-health.py
curl --fail --show-error --remote-name \
https://adios.dev/examples/anycast-cdn/edge-health.service
# Review both files, then install on the dedicated example edge.
sudo install -m 755 edge-health.py /usr/local/sbin/edge-health.py
sudo install -m 644 edge-health.service /etc/systemd/system/edge-health.service
sudo tee /etc/default/edge-health >/dev/null <<'EOF'
CDN_HOST=cdn.example.com
CDN_IP=203.0.113.80
EOF
# Replace these documentation values before starting.
sudoedit /etc/default/edge-health
sudo systemctl daemon-reload
sudo systemctl enable --now edge-health
sudo journalctl -u edge-health -n 30 --no-pagerVerifica cache hit e failover
Su ogni PoP, richiedi due volte la risorsa di test. Una chiave nuova deve produrre MISS e poi HIT. Conferma che la seconda richiesta non raggiunga l'origine controllando il suo log di accesso. Un HIT iniziale indica che la chiave è già in cache.
Run locally on each edge
for attempt in 1 2; do
curl --silent --show-error --fail --max-time 10 \
--resolve cdn.example.com:443:203.0.113.80 \
-D - -o /dev/null https://cdn.example.com/assets/logo.v1.svg
done
# This request should report X-Cache: BYPASS.
curl --silent --show-error --fail --max-time 10 \
--resolve cdn.example.com:443:203.0.113.80 \
-H 'Cookie: session=cdn-test' -D - -o /dev/null \
https://cdn.example.com/assets/logo.v1.svgRitira un PoP
Da una rete esterna che al momento raggiunge Parigi, continua a creare nuove connessioni HTTPS. Ferma il controller di controllo dello stato prima di disabilitare manualmente la rotta, così non può riabilitarla. Verifica che le richieste riuscite finiscano per identificare New York. Registra gli errori e il tempo trascorso; le connessioni esistenti potrebbero dover essere ristabilite.
Run on Paris while watching an external probe
sudo systemctl stop edge-health
sudo birdc disable cdn_prefix
sudo birdc show route export transit
# After local HTTPS checks pass again:
sudo systemctl start edge-health
# The controller waits for sustained health before advertising.Verifica un guasto del servizio e un riavvio
Con il controller in esecuzione e la rotta annunciata, ferma NGINX a Parigi. Conferma che il controller ritiri cdn_prefix e che le richieste esterne passino a New York. Avvia di nuovo NGINX e verifica che il ritardo di recupero impedisca un nuovo annuncio immediato. Ripeti sull'altro nodo edge.
Riavvia un nodo edge mentre l'altro serve traffico. Verifica che indirizzo dell'interfaccia dummy, sessione BIRD, certificato, cache e controller si ripristinino nell'ordine corretto. Misura il comportamento del nodo rimasto attivo sia con cache calda sia con cache fredda. Registra i risultati osservati insieme alle versioni software e alle reti usate per le verifiche; non presumere un tempo fisso di convergenza BGP.
Run on one edge while probing from another network
sudo systemctl stop nginx
# Wait for the controller's failure threshold; check the journal and route.
sudo journalctl -u edge-health -n 30 --no-pager
sudo birdc show route export transit
sudo systemctl start nginx
# Watch recovery, then repeat the test with a planned reboot.Aggiungi pool Anycast regionali con GeoDNS
Crea almeno due nodi edge per pool regionale usando la stessa configurazione BIRD, TLS e cache. Assegna un IP di servizio all'Europa e un altro al Nord America. Dentro ogni pool, tutti i nodi edge annunciano lo stesso prefisso. Ogni pool IPv4 instradato in modo indipendente richiede un proprio prefisso accettato, in genere un /24; due IP dello stesso /24 condiviso non creano rotte regionali BGP indipendenti.
Modifica l'indirizzo dell'interfaccia dummy, la rotta che copre il prefisso, il prefisso e il filtro di esportazione BIRD, l'indirizzo di ascolto NGINX e CDN_IP del controller in base al pool. Tieni gli indirizzi di gestione e origine fuori da quei prefissi di servizio. Tutti i pool servono lo stesso hostname CDN, con certificati validi e regole di cache coerenti. Imposta l'origine per ogni pool se l'applicazione richiede backend regionali.
| Posizione della query | Risposta DNS per cdn.example.com | Nodi edge che annunciano quell'IP |
|---|---|---|
| Europa | EU_CDN_IP | Parigi e Francoforte, usando EU_PREFIX/24. |
| Nord America | US_CDN_IP | New York e Chicago, usando US_PREFIX/24. |
| Predefinito / fallback | GLOBAL_CDN_IP | Il pool globale, che usa il proprio GLOBAL_PREFIX/24 separato. |
Crea i record GeoDNS
In un servizio GeoDNS come Route 53, crea record A di geolocalizzazione con lo stesso nome, cdn.example.com, e identificatori distinti. Imposta Europa su EU_CDN_IP, Nord America su US_CDN_IP e Default su GLOBAL_CDN_IP. Questi valori sono segnaposto per i tuoi indirizzi reali. Inizia con un TTL di 60 secondi e misura il comportamento dei resolver.
Se sposti il DNS autoritativo da Cloudflare a Route 53, aggiorna anche l'emissione dei certificati per usare il plugin DNS di Route 53, oppure delega consapevolmente la zona delle challenge ACME. Il plugin Cloudflare precedente richiede il controllo dei record autoritativi delle challenge.
Associa ogni record allo stato del relativo pool. In Route 53, una corrispondenza geografica non sana può ripiegare su un record geografico più ampio e poi sul record predefinito. Mantieni il fallback globale sano e con capacità sufficiente ad assorbire il traffico regionale. Se ospiti insieme pool globali e regionali, configura e monitora separatamente i loro prefissi; il controller dell'esempio gestisce un prefisso per istanza.
Verifica lo stato dei pool, poi prova entrambi i percorsi di guasto
Combina le verifiche dei singoli nodi edge tramite percorsi unicast con controlli esterni dell'IP di servizio regionale. Un controllo verso un IP Anycast può continuare a riuscire dopo il guasto di un nodo perché raggiunge un altro nodo. Rimuovi il pool dal DNS quando non può servire traffico, anziché a ogni guasto di un singolo membro.
Ritira prima un nodo edge: l'IP regionale deve continuare a funzionare tramite un altro nodo dello stesso pool. Poi rendi indisponibile l'intero pool in un test controllato: le nuove risposte DNS devono selezionare il fallback. Verifica sia nuove risoluzioni sia client che conservano la vecchia risposta. Le modifiche DNS non possono spostare una connessione esistente né sostituire immediatamente tutte le risposte in cache.
GeoDNS stima la posizione dal resolver ricorsivo o da un'indicazione EDNS Client Subnet. Verifica da più reti reali, inclusi resolver pubblici. Non considerare un record predefinito una garanzia di recupero: Route 53 può restituire record non sani quando tutte le opzioni idonee falliscono le verifiche dello stato.
Run from machines in each target region
dig +short cdn.example.com A
curl --silent --show-error --fail --max-time 10 \
-D - -o /dev/null https://cdn.example.com/assets/logo.v1.svg
# Record: DNS answer, X-Edge-Id, X-Cache, errors, and timing.
# Repeat during one-edge withdrawal and during whole-pool failure.Altre configurazioni di instradamento
Puoi anche combinare nodi annunciati globalmente con nodi le cui rotte vengono esportate dall'upstream solo verso reti selezionate. Configura questa politica con le community BGP documentate dal provider e verifica l'ambito dall'esterno. NO_EXPORT riguarda i confini tra AS, non i continenti. È una politica di instradamento distinta dalla selezione dei pool regionali tramite GeoDNS.
Se un provider di hosting non può stabilire un peering BGP, un provider di transito può annunciare il tuo prefisso e consegnare il traffico tramite tunnel. Verifica instradamento di ritorno e MTU e installa una cache in ogni sede ricevente. Riportare tutti i tunnel a un'unica cache distante mantiene quella cache e i suoi collegamenti nel percorso di ogni richiesta.
Mantieni operativa la CDN
Monitora ogni PoP sia tramite il percorso unicast di gestione sia tramite l'IP Anycast pubblico. Altrimenti una sede guasta può sparire dai controlli quando l'instradamento invia tutte le verifiche a una sede sana.
| Problema | Cosa noterai | Cosa fare |
|---|---|---|
| GeoDNS indirizza i client verso un pool indisponibile | Nuove risoluzioni o risposte in cache continuano a raggiungere una regione guasta. | Verifica lo stato dei pool, la politica predefinita, la cache dei resolver e la capacità di fallback. Simula il guasto di un'intera regione separatamente dal ritiro di un singolo nodo edge. |
| Modifiche al noleggio, al ROA o ai record di instradamento | Alcune reti smettono di raggiungere il prefisso mentre le sessioni BGP rimangono in funzione. | Monitora le date di rinnovo e la validità RPKI. Ricontrolla l'autorizzazione prima di cambiare ASN o upstream. Prevedi un periodo di sovrapposizione quando cambi gli indirizzi dello spazio noleggiato. |
| Il traffico si sposta dopo un cambio di provider | I client raggiungono un PoP distante o sovraccaricano una sede più piccola. | Misura ID del nodo edge e latenza da più reti di accesso. Esamina politica e ambito dell'upstream prima di modificare community o prepending. |
| Un PoP si guasta oppure la sua cache si riavvia | Il nodo edge rimasto attivo o l'origine ricevono un picco improvviso di traffico. | Verifica la capacità di failover con cache fredda. Prevedi margine per banda e spazio su disco; aggiungi un origin shield quando il popolamento duplicato delle cache lo giustifica. |
| Contenuti obsoleti o privati vengono memorizzati in cache | Gli utenti vedono versioni obsolete o la risposta di un altro utente. | Usa risorse versionate. Verifica il comportamento di Cookie, Authorization, private, no-store e Set-Cookie dopo le modifiche. Se aggiungi lo svuotamento della cache, rendi osservabile la consegna delle richieste di svuotamento. |
| Una distribuzione o un certificato differiscono tra i PoP | Solo alcune reti riscontrano errori TLS, altri errori o il comportamento precedente. | Distribuisci prima su un solo PoP. Verifica scadenza dei certificati, versione della configurazione e risposte HTTPS reali su ogni nodo prima di estendere la distribuzione. |
| Il controller di controllo dello stato si guasta o oscilla | Un nodo edge guasto continua ad annunciare la rotta, oppure i client cambiano ripetutamente posizione. | Supervisiona il controller, imponi pause minime prima del ripristino e verifica il watchdog. Coordina il comportamento graceful restart con l'upstream. |
| Un tunnel o un percorso di ritorno si interrompe | Le richieste piccole funzionano, ma i trasferimenti grandi si bloccano, oppure le risposte non arrivano mai. | Verifica MTU, path-MTU discovery, instradamento di ritorno e filtri sull'indirizzo sorgente. Prova download di grandi dimensioni dopo modifiche al tunnel o al provider. |
| Un attacco satura il link | I server sani diventano irraggiungibili prima che i limiti HTTP possano essere utili. | Predisponi la mitigazione con l'upstream e conosci il processo di attivazione. Mantieni limitato l'accesso all'origine e monitora il traffico in uscita e quello che aggira la cache. |
| Diversi servizi condividono lo stesso /24 | Il ritiro dovuto a un servizio guasto sposta anche i servizi sani. | Definisci una politica di controllo dello stato per ogni servizio raggiunto tramite il prefisso. Usa prefissi instradabili separati quando i servizi richiedono ritiri indipendenti. |
La tua prima CDN funzionante
Puoi iniziare a inviare traffico quando entrambi i PoP servono HTTPS valido, ciascuno dimostra MISS e poi HIT, le risposte private rimangono fuori dalla cache e il ritiro di una qualsiasi delle due rotte sposta le nuove richieste alla sede rimasta attiva. Inizia con risorse statiche pubbliche e misura il carico sull'origine prima di aggiungere altri percorsi memorizzabili in cache.