Bygger och konfigurerar din egen CDN

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.

Bygger och konfigurerar din egen CDN
KĂ€lla: Infografik vektor skapad av pikisuperstar — www.freepik.com

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 BunnyCDN 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 enligt denna instruktion 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: OVH, Leaseweb och 100Tb – för dedikerade servrar, Vultr och DigitalOcean – 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:

Bygger och konfigurerar din egen CDN Frankfurt, ip: 199.247.18.199

Bygger och konfigurerar din egen CDN Chicago, ip: 149.28.121.123

Bygger och konfigurerar din egen CDN 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:

  1. 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.
  2. 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 gratisalternativ.
  3. Beroende pÄ klientens plats returnerar den IP-adressen till den nÀrmaste CDN-servern.

En DNS-server med geoDNS-funktion kan byggas pÄ egen hand, men det Àr bÀttre att anvÀnda fÀrdiga lösningar med ett nÀtverk av DNS-servrar över hela vÀrlden och Anycast Out-of-the-box:

  • CloudDNS frĂ„n $9.95/mĂ„nad, GeoDNS-tariff, som har en DNS Failover som standard
  • Zilore frĂ„n $25/mĂ„nad, inkluderat DNS Failover
  • Amazon Route 53 frĂ„n $35/mĂ„nad för 50M rena geo-förfrĂ„gningar. DNS Failover debiteras separat
  • DNS Made Easy frĂ„n $125/mĂ„nad, har 10 DNS Failover
  • Cloudflare, 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 ClouDNS, 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:

Bygger och konfigurerar din egen CDN
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:

Bygger och konfigurerar din egen CDN

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 ACME Shell script. 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 ~/bashrc

Under 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:

Bygger och konfigurerar din egen CDN

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 med nyckel, 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 nginx

IstÀ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 reload

VÄ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, — det som gjordes. 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.jpg

IstÀ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 kartan över undervattenskommunikationer, 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 pingarna frĂ„n olika platser 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 — hĂ€r och hastighetsökning under hög belastning: hĂ€r och hĂ€r

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster