InnehÄllsleveransnÀtverk (CDN) anvÀnds pÄ webbplatser och i applikationer frÀmst för att snabba upp laddningen av statiska element. Detta sker genom att filer cachas pÄ CDN-servrar som ligger i olika geografiska regioner. NÀr anvÀndaren begÀr data via CDN fÄr de det frÄn nÀrmaste server.
Principen för hur innehÄllsleveransnÀtverk fungerar Àr i stort sett densamma. NÀr en CDN-server fÄr en begÀran om att ladda en fil hÀmtar den en gÄng filen frÄn den ursprungliga servern och levererar den till anvÀndaren, samtidigt som den cachar den pÄ angiven tid. För alla efterföljande begÀrningar levereras svaret frÄn cachen. Alla CDN har alternativ för förhandsladdning av filer, rensning av cache, instÀllningar för lagringstid och mycket mer.
Ibland krĂ€vs det av olika skĂ€l att organisera ett eget innehĂ„llsleveransnĂ€tverk, och dĂ„ â mĂ„ instruktionen för att bygga Ă€nnu en cykel vara till hjĂ€lp.

KĂ€lla:
NÀr behöver man ett eget CDN
LÄt oss se pÄ situationer dÀr det Àr meningsfullt att starta ett eget CDN:
- nÀr man vill spara pengar, och de nuvarande kostnaderna Àven vid anvÀndning av billiga CDN som uppgÄr till flera hundra dollar per mÄnad
- om vi vill fÄ en permanent cache eller cache utan grannar pÄ servern och kanalen
- i den region du behöver har CDN-tjÀnster inga punkter för nÀrvaro
- speciella instÀllningar för leverans av innehÄll krÀvs
- vi vill snabba upp leveransen av dynamiskt innehÄll genom att placera produktionsservrar nÀrmare anvÀndarna
- det finns oro för att en extern CDN-tjÀnst kan olagligt samla in eller anvÀnda information om anvÀndarnas beteende (hej tjÀnster utan GDPR-efterlevnad) eller utföra andra olagliga handlingar
I de flesta andra fall Àr det mer rationellt att anvÀnda befintliga lösningar.
Vad behövs för att starta
Det Àr fantastiskt om du har ett eget autonomt system (AS). Med detta kan du tilldela samma IP-adress till flera servrar och pÄ nÀtverksnivÄ styra anvÀndare till den nÀrmaste. Det Àr vÀrt att nÀmna att Àven med ett adressblock /24 finns det möjlighet att bygga ett innehÄllsleveransnÀtverk. Vissa serverleverantörer tillÄter att göra en tillkÀnnagivelse för anvÀndning i alla tillgÀngliga regioner.
Om du inte Àr en lycklig Àgare av en IP-adressblock, behöver du följande för att starta ett enkelt CDN:
- ett domÀnnamn eller subdomÀn
- minst tvÄ servrar i olika regioner. Servern kan vara antingen dedikerad eller virtuell
- ett geoDNS-verktyg. Med hjÀlp av detta kommer anvÀndaren, genom att anropa domÀnen, att dirigeras till den nÀrmaste servern
Vi registrerar domÀnen och bestÀller servrar
Att registrera domĂ€nen Ă€r enkelt â registrera den i valfri zon hos vilken registrar som helst. För CDN kan du ocksĂ„ anvĂ€nda en subdomĂ€n, som nĂ„got i stil med cdn.dittdomĂ€nnamn.com. Egentligen kommer vi att göra just detta i vĂ„rt exempel.
NĂ€r det gĂ€ller att bestĂ€lla servrar â de bör hyras i de regioner och lĂ€nder dĂ€r din anvĂ€ndarpublik finns. Om projektet Ă€r internationellt Ă€r det ŃĐŽĐŸĐ±ĐœĐŸ att vĂ€lja hosting-leverantörer som erbjuder servrar över hela vĂ€rlden. Exempel: , och â för dedikerade servrar, och â för virtuella moln*.
För vÄrt privata CDN bestÀller vi 3 virtuella servrar pÄ olika kontinenter. Vi har Vultr en server för $5/mÄnad och fÄr 25GB SSD plats och 1TB trafik. Vid installationen vÀljer vi den senaste Debian. VÄra servrar:
Frankfurt, ip: 199.247.18.199
Chicago, ip: 149.28.121.123
Singapore, ip: 157.230.240.216
* Vultr och DigitalOcean erbjuder $100 kredit till anvÀndare som registrerar sig via lÀnkarna i artikeln, direkt efter att de lagt till en betalningsmetod. Författaren fÄr ocksÄ en liten belöning för detta, vilket just nu Àr mycket betydelsefullt för honom. VÀnligen ha överseende med detta.
Vi konfigurerar geoDNS
För att anvÀndaren ska dirigeras till rÀtt (nÀrmaste) server nÀr de anropar domÀnen eller subdomÀnen CDN, behöver vi en DNS-server med geoDNS-funktion.
Principen och arbetsordningen för geoDNS Àr följande:
- BestÀmmer IP-adressen för klienten som skickade DNS-förfrÄgan, eller IP-adressen för den rekursiva DNS-server som anvÀnds vid hantering av klientens förfrÄgan. SÄdana rekursiva servrar Àr vanligtvis DNS frÄn leverantörer.
- Genom klientens IP-adress tar den reda pÄ vilket land eller region denne kommer ifrÄn. För detta anvÀnds GeoIP-databaser, av vilka det idag finns mÄnga. Det finns nÄgra bra .
- Beroende pÄ klientens plats returnerar den IP-adressen till den nÀrmaste CDN-servern.
En DNS-server med geoDNS-funktion kan , men det Àr bÀttre att anvÀnda fÀrdiga lösningar med ett nÀtverk av DNS-servrar över hela vÀrlden och Out-of-the-box:
- frÄn $9.95/mÄnad, GeoDNS-tariff, som har en DNS Failover som standard
- frÄn $25/mÄnad, inkluderat DNS Failover
- frÄn $35/mÄnad för 50M rena geo-förfrÄgningar. DNS Failover debiteras separat
- frÄn $125/mÄnad, har 10 DNS Failover
- , funktionen "Geo Steering" Àr tillgÀnglig i Enterprise-planer
Vid bestÀllning av geoDNS bör du vara uppmÀrksam pÄ antalet förfrÄgningar som ingÄr i planen och tÀnka pÄ att det faktiska antalet förfrÄgningar till domÀnen kan överstiga förvÀntningarna med flera gÄnger. Miljontals spindlar, skannrar, spammare och annan oönskad trafik arbetar oförtrutet.
NÀstan alla DNS-tjÀnster inkluderar den ovÀrderliga tjÀnsten DNS Failover för att bygga CDN. Med den kan du stÀlla in övervakning av dina servrar och automatiskt ersÀtta adressen till den icke fungerande servern med en reservadress i DNS-svaren vid avsaknad av livstecken.
För att bygga vÄrt CDN kommer vi att anvÀnda , GeoDNS-plan.
Vi lÀgger till en ny DNS-zon i vÄrt anvÀndarkonto och anger vÄr domÀn. Om vi bygger CDN pÄ en subdomÀn och den huvudsakliga domÀnen redan anvÀnds, glöm inte att lÀgga till de befintliga arbets-DNS-posterna direkt efter att zonen har lagts till. NÀsta steg Àr att skapa flera A-poster för CDN-domÀnen/subdomÀnen, var och en som ska gÀlla för den region vi har angivit. Som regioner kan vi ange kontinenter eller lÀnder, för USA och Kanada Àr subregioner tillgÀngliga.
I vÄrt fall kommer CDN att byggas pÄ subdomÀnen cdn.sayt.in. Efter att ha lagt till zonen sayt.in, skapar vi den första A-posten för subdomÀnen och dirigerar hela Nordamerika till servern i Chicago:

Vi upprepar ÄtgÀrden för andra regioner, och glömmer inte att skapa en post för standardregioner. SÄ hÀr blir det slutgiltiga resultatet:

Den sista standardposten pÄ skÀrmdumpen innebÀr att alla icke angivna regioner (som Europa, Afrika, anvÀndare av satellitinternet osv.) kommer att dirigeras till servern i Frankfurt.
SÄ hÀr avslutas den grundlÀggande DNS-instÀllningen. Det Àr dags att gÄ till domÀnregistrarens webbplats och ersÀtta de nuvarande NS-posterna för domÀnen med de som ClouDNS tillhandahöll. Under tiden NS-posterna uppdateras förbereder vi servrarna.
Installation av SSL-certifikat
VĂ„rt CDN kommer att fungera över HTTPS, sĂ„ om du redan har SSL-certifikat för domĂ€nen eller subdomĂ€nen, ladda upp dem till alla servrar, till exempel till katalogen /etc/ssl/ĐČаŃĐŽĐŸĐŒĐ”Đœ/
Om det inte finns nĂ„gra certifikat kan du fĂ„ ett gratis frĂ„n Letâs Encrypt. För detta passar . Klienten Ă€r bekvĂ€m och enkel att konfigurera, och viktigast av allt â den tillĂ„ter validering av domĂ€n/subdomĂ€n via DNS genom ClouDNS API.
Vi installerar acme.sh bara pĂ„ en av servrarna â den europeiska 199.247.18.199, frĂ„n vilken certifikaten kommer att kopieras till alla andra. För installationen kör vi:
root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/bashrcUnder installationen av skriptet kommer ett CRON-jobb att skapas för framtida uppdateringar av certifikaten utan vÄr medverkan.
Domainverifiering vid utfÀrdande av certifikat kommer att ske via DNS med anvÀndning av API, sÄ i ClouDNSs personliga konto behöver du skapa en ny API-anvÀndare i menyn Reseller API och ange ett lösenord för den. Den erhÄllna auth-id med lösenordet kommer att anges i filen ~/acme.sh/dnsapi/dns_cloudns.sh (förvÀxla inte med filen dns_clouddns.sh). HÀr Àr raderna som behöver avkommenteras och redigeras:
CLOUDNS_AUTH_ID=
CLOUDNS_AUTH_PASSWORD=""
Nu begÀr vi SSL-certifikatet för cdn.sayt.in
root@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"I parametrarna, för framtiden, har vi angett kommandot för automatisk omstart av webbserverns konfiguration efter varje förnyelse av certifikatets giltighet.
Hela processen för att fÄ certifikatet kan ta upp till 2 minuter, avbryt den inte. Om det uppstÄr ett valideringsfel, försök att köra kommandot igen. I slutet ser vi vart certifikaten har laddats upp:

Vi kommer att minnas dessa vĂ€gar, de mĂ„ste anges vid kopiering av certifikatet till andra servrar samt i webbserverns instĂ€llningar. Vi bryr oss inte om fel vid omstart av Nginx-konfigar, â pĂ„ en helt konfigurerad server kommer det inte att finnas nĂ„got.
Allt som ÄterstÄr med SSL Àr att kopiera det erhÄllna certifikatet till tvÄ andra servrar med bibehÄllande av filvÀgarna. Vi skapar samma kataloger pÄ var och en av dem och gör en kopia:
root@cdn:~# mkdir -p /root/.acme.sh/cdn.sayt.in/
root@cdn:~# scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/
För att certifikatförnyelser ska ske regelbundet skapar vi ett dagligt CRON-jobb pÄ bÄda servrarna med kommandot:
scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload
DÀrmed mÄste Ätkomsten till den avlÀgsna kÀllservern vara konfigurerad , det vill sÀga utan att ange lösenord. Glöm inte att göra det.
Installation och konfiguration av Nginx
För att leverera statiskt innehÄll kommer vi att anvÀnda Nginx, konfigurerad i cache-proxy-lÀge. LÄt oss uppdatera paketlistorna och installera det pÄ alla tre servrar:
root@cdn:~# apt update
root@cdn:~# apt install nginxIstÀllet för standard-konfigurationen anvÀnder vi den nedanstÄende konfigurationen:
nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 4096;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log off;
error_log /var/log/nginx/error.log;
gzip on;
gzip_disable "msie6";
gzip_comp_level 6;
gzip_proxied any;
gzip_vary on;
gzip_types text/plain application/javascript text/javascript text/css application/json application/xml text/xml application/rss+xml;
gunzip on;
proxy_temp_path /var/cache/tmp;
proxy_cache_path /var/cache/cdn levels=1:2 keys_zone=cdn:64m max_size=20g inactive=7d;
proxy_cache_bypass $http_x_update;
server {
listen 443 ssl;
server_name cdn.sayt.in;
ssl_certificate /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.cer;
ssl_certificate_key /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.key;
location / {
proxy_cache cdn;
proxy_cache_key $uri$is_args$args;
proxy_cache_valid 90d;
proxy_pass https://sayt.in;
}
}
}I konfigurationen redigerar vi:
- max_size â storleken pĂ„ cachen, som inte fĂ„r överskrida det tillgĂ€ngliga utrymmet pĂ„ disken
- inactive â tiden som cachelagrade data hĂ„lls nĂ€r ingen har begĂ€rt dem
- ssl_certificate och ssl_certificate_key â sökvĂ€gar till SSL-certifikat- och nyckelfiler
- proxy_cache_valid â tiden som cachelagrade data hĂ„lls
- proxy_pass â adressen till den ursprungliga servern som CDN kommer att begĂ€ra filer för caching frĂ„n. I vĂ„rt exempel Ă€r detta sayt.in
Som vi ser, Àr allt ganska enkelt. SvÄrigheten kan bara uppstÄ vid instÀllning av cachens tidsperiod pÄ grund av likheten mellan direktiven inactive och proxy_cache_valid. LÄt oss gÄ igenom dem med vÄrt exempel. SÄ hÀr fungerar det vid inactive=7d och proxy_cache_valid 90d:
- om förfrÄgan inte upprepas inom 7 dagar, kommer data att raderas frÄn cachen efter denna period
- om förfrÄgan upprepas Ätminstone en gÄng var 7:e dag, kommer data i cachen att betraktas som förÄldrade efter 90 dagar och vid nÀsta förfrÄgan kommer Nginx att uppdatera dem genom att hÀmta frÄn den ursprungliga servern
NĂ€r vi har avslutat redigeringen nginx.conf, laddar vi om konfigurationen:
root@cdn:~# service nginx reloadVÄr CDN Àr nu helt klar. För $15/mÄn. har vi fÄtt nÀrvaropunkter pÄ tre kontinenter och 3 TB trafik: 1 TB i varje plats.
Vi testar CDN:ns funktionalitet
LÄt oss titta pÄ pingarna till vÄrt CDN frÄn olika geografiska lÀgen. NÄgra ping-tjÀnster fungerar bra för detta.
Startpunkt
VĂ€rd
IP
Genomsnittlig tid, ms
Tyskland, Berlin
cdn.sayt.in
199.247.18.199
9.6
NederlÀnderna, Amsterdam
cdn.sayt.in
199.247.18.199
10.1
Frankrike, Paris
cdn.sayt.in
199.247.18.199
16.3
Storbritannien, London
cdn.sayt.in
199.247.18.199
14.9
Kanada, Toronto
cdn.sayt.in
149.28.121.123
16.2
USA, San Francisco
cdn.sayt.in
149.28.121.123
52.7
USA, Dallas
cdn.sayt.in
149.28.121.123
23.1
USA, Chicago
cdn.sayt.in
149.28.121.123
2.6
USA, New York
cdn.sayt.in
149.28.121.123
19.8
Singapore
cdn.sayt.in
157.230.240.216
1.7
Japan, Tokyo
cdn.sayt.in
157.230.240.216
74.8
Australia, Sydney
cdn.sayt.in
157.230.240.216
95.9
Resultaten Ă€r bra. Nu lĂ€gger vi en testbild i roten av huvudwebbplatsen. test.jpg och kontrollerar hastigheten för dess laddning via CDN. Som sagt, â . InnehĂ„llet levereras snabbt.
Vi kommer att skriva ett litet skript om vi vill rensa cachen pÄ CDN-punkten.
purge.sh
#!/bin/bash
if [ -z "$1" ]
then
echo "Purging all cache"
rm -rf /var/cache/cdn/*
else
echo "Purging $1"
FILE=`echo -n "$1" | md5sum | awk '{print $1}'`
FULLPATH=/var/cache/cdn/${FILE:31:1}/${FILE:29:2}/${FILE}
rm -f "${FULLPATH}"
fi
För att ta bort hela cachen rÀcker det att köra det, enskilda filer kan rensas sÄ hÀr:
root@cdn:~# ./purge.sh /test.jpgIstÀllet för slutsatser
Till sist vill jag ge nÄgra anvÀndbara tips för att undvika de fallgropar som tidigare har gett mig huvudvÀrk:
- För att öka redundansen i CDN rekommenderas det att konfigurera DNS Failover, vilket hjÀlper att snabbt Àndra A-posten om servern gÄr sönder. Detta görs i kontrollpanelen för domÀnens DNS-poster.
- Webbplatser med stor geografisk tÀckning krÀver utan tvekan mÄnga CDN-punkter, men lÄt oss vara rimliga. AnvÀndaren kommer troligen inte att mÀrka nÄgon betydande skillnad jÀmfört med en betald CDN om du placerar servrar pÄ 6-7 platser: Europa, Nordamerika (östra), Nordamerika (vÀstra), Singapore, Australien, Hongkong eller Japan.
- Ibland tillÄter inte webbhotell att anvÀnda hyrda servrar för CDN-ÀndamÄl. SÄ om du av nÄgon anledning beslutar dig för att driftsÀtta ett content delivery network som en tjÀnst, glöm inte att lÀsa reglerna för den specifika webbhotellleverantören i förvÀg.
- Studera , för att förstÄ hur kontinenterna hÀnger ihop och ta hÀnsyn till detta nÀr du bygger ett nÀtverk för content delivery.
- Försök att kontrollera till dina servrar. PÄ sÄ sÀtt kan man se de nÀrmaste regionerna till CDN-punkterna och optimera GeoDNS.
- Beroende pĂ„ uppgifterna kan det vara bra att justera Nginx för de specifika cachekraven och med hĂ€nsyn till serverbelastningen. Jag fick mycket hjĂ€lp av artiklar om Nginx-cache â och hastighetsökning under hög belastning: och
KĂ€lla: habr.com
