Samlar in och stÀller in ditt CDN

Content delivery networks (CDN) anvÀnds av webbplatser och applikationer frÀmst för att pÄskynda laddningen av statiska element. Detta sker genom att cachelagra filer pÄ CDN-servrar som finns i olika geografiska regioner. Genom att begÀra data via CDN fÄr anvÀndaren den frÄn nÀrmaste server.

Funktionsprincipen och funktionaliteten för alla innehÄllsleveransnÀtverk Àr ungefÀr densamma. Efter att ha mottagit en begÀran om att ladda ner en fil tar CDN-servern den en gÄng frÄn den ursprungliga servern och ger den till anvÀndaren, samtidigt som den cachelagras under en viss tidsperiod. Alla efterföljande förfrÄgningar besvaras frÄn cachen. Alla CDN:er har alternativ för att ladda filer i förvÀg, rensa cacheminne, stÀlla in cache-utgÄng och mycket mer.

Det hÀnder att det av en eller annan anledning Àr nödvÀndigt att organisera ditt eget nÀtverk för innehÄllsleverans, och dÄ - kan instruktionerna för montering av nÀsta cykel vara till hjÀlp för oss.

Samlar in och stÀller in ditt CDN
KĂ€lla: Infografisk vektor skapad av pikisuperstar — www.freepik.com

NÀr behöver du ditt eget CDN?

LÄt oss titta pÄ fall dÀr det Àr vettigt att köra ditt eget CDN:

  • nĂ€r du vill spara pengar och driftskostnader Ă€ven nĂ€r du anvĂ€nder billiga CDN som BunnyCDN uppgĂ„r till flera hundra dollar i mĂ„naden
  • om vi vill fĂ„ en permanent cache eller en cache utan grannar pĂ„ servern och kanalen
  • CDN-tjĂ€nster har inte nĂ€rvaropunkter i den region du behöver
  • Eventuella sĂ€rskilda instĂ€llningar för innehĂ„llsleverans krĂ€vs
  • vi vill pĂ„skynda leveransen av dynamiskt innehĂ„ll genom att placera produktionsservrar nĂ€rmare anvĂ€ndarna
  • det finns en oro för att en CDN-tjĂ€nst frĂ„n tredje part kan samla in eller anvĂ€nda information om anvĂ€ndarbeteende pĂ„ ett felaktigt sĂ€tt (hej till tjĂ€nster som inte Ă€r GDPR-kompatibla) eller delta i andra olagliga aktiviteter

I de flesta andra fall Àr det lÀmpligare att anvÀnda befintliga fÀrdiga lösningar.

Vad du behöver för att börja

Det Àr underbart om du har ett eget autonomt system (AS). Med den kan du tilldela samma IP till flera servrar och enligt dessa instruktioner pÄ nÀtverksnivÄ, hÀnvisa anvÀndare till den nÀrmaste. Det Àr vÀrt att sÀga att Àven med ett /24-adressblock Àr det möjligt att bygga ett innehÄllsleveransnÀtverk. Vissa serverleverantörer tillÄter dig att annonsera för anvÀndning i alla tillgÀngliga regioner.

Om du inte Àr den lyckliga Àgaren av ett block med IP-adresser behöver du för att starta ett enkelt CDN:

  • domĂ€nnamn eller underdomĂ€n
  • minst tvĂ„ servrar i olika regioner. Servern kan antingen vara dedikerad eller virtuell
  • geoDNS-verktyg. Med dess hjĂ€lp kommer en anvĂ€ndare som kommer Ă„t en domĂ€n att dirigeras till nĂ€rmaste server

Registrera en domÀn och bestÀll servrar

Med domÀnregistrering Àr allt enkelt - vi registrerar oss i vilken zon som helst hos vilken registrar som helst. Du kan ocksÄ anvÀnda en underdomÀn för CDN, till exempel nÄgot liknande cdn.domainname.com. Faktum Àr att i vÄrt exempel kommer vi att göra just det.

NĂ€r det gĂ€ller bestĂ€llningsservrar bör de hyras i de regioner och lĂ€nder dĂ€r din anvĂ€ndarpublik finns. Om projektet Ă€r interkontinentalt Ă€r det bekvĂ€mt att vĂ€lja vĂ€rdleverantörer som erbjuder servrar över hela vĂ€rlden. Exempel: OVH, Leaseweb Đž 100Tb - för dedikerade servrar, Vultr Đž DigitalOcean — för virtuellt moln*.

För vÄrt privata CDN kommer vi att bestÀlla 3 virtuella servrar pÄ olika kontinenter. U Vultr pÄ servern för $5/mÄnad vi kommer fÄ 25GB SSD platser och 1TB trafik. Under installationen kommer vi att vÀlja den senaste Debian. VÄra servrar:

Samlar in och stÀller in ditt CDN Frankfurt, IP: 199.247.18.199

Samlar in och stÀller in ditt CDN Chicago, IP: 149.28.121.123

Samlar in och stÀller in ditt CDN Singapore, IP: 157.230.240.216

*Vultr och DigitalOcean utlovar $100 i kredit till anvÀndare som registrerar sig med lÀnkarna i den hÀr artikeln nÀr de har lagt till en betalningsmetod. Författaren fÄr ocksÄ en liten komplimang av detta, vilket Àr mycket betydelsefullt för honom nu. Var förstÄende.

Konfigurera geoDNS

För att sÀkerstÀlla att nÀr en anvÀndare kommer Ät en CDN-domÀn eller underdomÀn, han dirigeras till den önskade (nÀrmaste) servern kommer vi att behöva en DNS-server med geoDNS-funktionen.

Principen och operationsproceduren för geoDNS Àr som följer:

  1. Definierar IP-adressen för klienten som skickade DNS-begÀran, eller IP-adressen för den rekursiva DNS-servern som anvÀnds vid bearbetning av klientbegÀran. SÄdana rekursiva servrar Àr vanligtvis DNS-leverantörer.
  2. Klientens IP identifierar dess land eller region. Till detta anvÀnds GeoIP-databaser, som det finns vÀldigt mÄnga av idag. Det finns nÄgra bra gratis alternativ.
  3. Beroende pÄ klientens plats ger den IP-adressen till nÀrmaste CDN-server.

DNS-server med geoDNS-funktion kan vara montera det sjÀlv, men det Àr bÀttre att anvÀnda fÀrdiga lösningar med ett nÀtverk av DNS-servrar runt om i vÀrlden och anycast frÄn lÄdan:

  • CloudDNS frĂ„n $9.95/mĂ„nad, GeoDNS-taxa, som standard finns det en DNS-failover
  • Zilore frĂ„n $25/mĂ„nad, DNS-failover aktiverad
  • Amazon vĂ€g 53 frĂ„n $35/mĂ„nad för rena 50 miljoner geofrĂ„gor. DNS-failover debiteras separat
  • DNS pĂ„ ett enkelt sĂ€tt frĂ„n $125/mĂ„nad, det finns 10 DNS-failovers
  • CloudFlare, "Geo Steering"-funktionen Ă€r tillgĂ€nglig i Enterprise-tariffer

NÀr du bestÀller geoDNS bör du vara uppmÀrksam pÄ antalet förfrÄgningar som ingÄr i tariffen och ta hÀnsyn till att det faktiska antalet förfrÄgningar till domÀnen kan vara mÄnga gÄnger högre Àn förvÀntat. Miljontals spindlar, skannrar, spammare och andra onda andar arbetar outtröttligt.

NÀstan alla DNS-tjÀnster inkluderar i priset en oumbÀrlig tjÀnst för att bygga en CDN - DNS Failover. Med dess hjÀlp kan du stÀlla in övervakning av driften av dina servrar och, om det inte finns nÄgra tecken pÄ liv, automatiskt ersÀtta adressen till den icke-fungerande servern i DNS-svar med en backup.

För att bygga vÄrt CDN kommer vi att anvÀnda CloudDNS, GeoDNS-tariff.

LĂ„t oss lĂ€gga till en ny DNS-zon i ditt personliga konto, som anger din domĂ€n. Om vi ​​bygger ett CDN pĂ„ en underdomĂ€n och huvuddomĂ€nen redan anvĂ€nds, glöm inte att lĂ€gga till de befintliga fungerande DNS-posterna omedelbart efter att du har lagt till zonen. NĂ€sta steg Ă€r att skapa flera A-poster för CDN-domĂ€nen/underdomĂ€nen, som var och en kommer att anvĂ€ndas för den region vi har angett. Du kan ange kontinenter eller lĂ€nder som regioner; underregioner Ă€r tillgĂ€ngliga för USA och Kanada.

I vÄrt fall kommer CDN att höjas pÄ en underdomÀn cdn.sayt.in. Genom att lÀgga till en zon sat.in, lÄt oss skapa den första A-posten för underdomÀnen och dirigera hela Nordamerika till servern i Chicago:

Samlar in och stÀller in ditt CDN
LÄt oss upprepa ÄtgÀrden för andra regioner, utan att glömma att skapa en post för standardregionerna. HÀr Àr vad du fÄr till slut:

Samlar in och stÀller in ditt CDN

Den sista standardposten i skÀrmdumpen innebÀr att alla ospecificerade regioner (och dessa Àr Europa, Afrika, satellitinternetanvÀndare, etc.) kommer att skickas till servern i Frankfurt.

Detta slutför den grundlÀggande DNS-instÀllningen. Allt som ÄterstÄr Àr att gÄ till domÀnregistratorns webbplats och ersÀtta de nuvarande domÀn-NS med de som utfÀrdats av ClouDNS. Och medan NS:erna uppdateras kommer vi att förbereda servrarna.

Installera SSL-certifikat

VÄrt CDN kommer att fungera över HTTPS, sÄ om du redan har SSL-certifikat för en domÀn eller underdomÀn, ladda upp dem till alla servrar, till exempel till katalogen /etc/ssl/dindomÀn/

Om du inte har certifikat kan du fÄ ett gratis frÄn Let's Encrypt. Perfekt för detta ACME Shell-skript. Klienten Àr bekvÀm och enkel att konfigurera, och viktigast av allt lÄter den dig validera en domÀn/underdomÀn med hjÀlp av DNS via API:et frÄn ClouDNS.

Vi kommer att installera acme.sh pÄ endast en av servrarna - European 199.247.18.199, frÄn vilken certifikat kommer att kopieras till alla andra. För att installera, gör:

root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/.bashrc

Under installationen av skriptet kommer en CRON-uppgift att skapas för ytterligare uppdatering av certifikat utan vÄr medverkan.

DomĂ€nverifiering nĂ€r du utfĂ€rdar ett certifikat kommer att utföras via DNS med hjĂ€lp av API:t, sĂ„ i ditt personliga ClouDNS-konto i ÅterförsĂ€ljar-API-menyn mĂ„ste du skapa en ny API-anvĂ€ndare och ange ett lösenord för den. Vi kommer att skriva det resulterande auth-id med lösenord i en fil ~/.acme.sh/dnsapi/dns_cloudns.sh (inte att förvĂ€xla med filen dns_clouddns.sh). HĂ€r Ă€r raderna som behöver okommenteras och redigeras:

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<ĐżĐ°Ń€ĐŸĐ»ŃŒ>"

LÄt oss nu begÀra ett SSL-certifikat 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, angav vi ett kommando för att automatiskt ladda om webbserverkonfigurationen efter varje certifikatets giltighetsuppdatering i framtiden.

Hela processen för att fÄ ett certifikat kan ta upp till 2 minuter, avbryt det inte. Om ett domÀnvalideringsfel uppstÄr, försök att köra kommandot igen. I slutet kommer vi att se var certifikaten laddades ner:

Samlar in och stÀller in ditt CDN

LÄt oss komma ihÄg dessa sökvÀgar; de mÄste specificeras nÀr du kopierar certifikatet till andra servrar, sÄvÀl som i webbserverinstÀllningarna. Vi uppmÀrksammar inte felet med att ladda om Nginx-konfigurationer - pÄ en fullt konfigurerad server kommer det inte att visas nÀr certifikat uppdateras.

Allt som ÄterstÄr för oss med SSL Àr att kopiera det mottagna certifikatet till tvÄ andra servrar och bevara sökvÀgen till filerna. LÄt oss skapa samma kataloger pÄ var och en av dem och göra 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 uppdatera certifikat regelbundet kommer vi att skapa en daglig CRON-uppgift 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

I det hÀr fallet mÄste Ätkomst till fjÀrrkÀllservern konfigureras med nyckel, dvs. utan att ange ett lösenord. Glöm inte att göra detta.

Installera och konfigurera Nginx

För att servera statiskt innehÄll kommer vi att anvÀnda Nginx konfigurerad som en caching proxyserver. LÄt oss uppdatera paketlistorna och installera dem pÄ alla tre servrarna:

root@cdn:~# apt update
root@cdn:~# apt install nginx

IstÀllet för standarden anvÀnder vi konfigurationen frÄn spoilern nedan:
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_storlek — cachestorlek som inte överstiger tillgĂ€ngligt diskutrymme
  • inaktiv — Lagringstid för cachad data som inte har nĂ„tts
  • ssl_certificate Đž ssl_certifikatnyckel — sökvĂ€gar till SSL-certifikat och nyckelfiler
  • proxy_cache_valid — Lagringstid för cachade data
  • proxy_pass — Adressen till den ursprungliga servern frĂ„n vilken CDN kommer att begĂ€ra filer för cachning. I vĂ„rt exempel Ă€r detta sat.in

Som du kan se Àr allt enkelt. Den enda svÄrigheten kan uppstÄ med att stÀlla in cachingtiden pÄ grund av likheten mellan direktiven inaktiv О proxy_cache_valid. LÄt oss titta pÄ dem med vÄrt exempel. Detta Àr vad som hÀnder nÀr inaktiv=7d О proxy_cache_valid 90d:

  • om begĂ€ran inte upprepas inom 7 dagar, kommer uppgifterna att raderas frĂ„n cachen efter denna period
  • om begĂ€ran upprepas minst en gĂ„ng var 7:e dag, kommer data i cachen att betraktas som inaktuell efter 90 dagar och med nĂ€sta begĂ€ran kommer Nginx att uppdatera den och ta den frĂ„n den ursprungliga servern

Har redigerat klart nginx.conf, ladda om konfigurationen:

root@cdn:~# service nginx reload

VÄrt CDN Àr helt klart. För $15/mÄnad. vi fick nÀrvaropunkter pÄ tre kontinenter och 3 TB trafik: 1 TB pÄ varje plats.

Kontrollerar CDN:s funktion

LÄt oss titta pÄ ping till vÄrt CDN frÄn olika geografiska platser. Alla pingtjÀnster Àr lÀmpliga 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

Australien, Sydney
cdn.sayt.in
157.230.240.216
95.9

Resultaten Àr bra. LÄt oss nu placera en testbild i roten pÄ huvudsidan test.jpg och kontrollera dess nedladdningshastighet via CDN. Det sÀgs - gjord. InnehÄllet levereras snabbt.

LÄt oss skriva ett litet skript ifall vi vill rensa cachen vid 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, kör bara den; du kan rensa en separat fil sÄ hÀr:

root@cdn:~# ./purge.sh /test.jpg

I stÀllet för slutsatser

Till sist vill jag ge nÄgra anvÀndbara tips för att omedelbart kliva över raken som en gÄng gav mig huvudvÀrk:

  • För att öka CDN-feltoleransen rekommenderas det att konfigurera DNS Failover, vilket hjĂ€lper till att snabbt Ă€ndra A-posten i hĂ€ndelse av ett serverfel. Detta görs i kontrollpanelen för domĂ€nens DNS-poster
  • Webbplatser med stor geografisk rĂ€ckvidd kommer utan tvekan att krĂ€va ett stort antal CDN-poĂ€ng, men lĂ„t oss inte vara fanatiska. Mest troligt kommer anvĂ€ndaren inte att mĂ€rka nĂ„gon signifikant skillnad jĂ€mfört med ett betald CDN om du placerar servrar pĂ„ 6-7 platser: Europa, Nordamerika (öst), Nordamerika (vĂ€st), Singapore, Australien, Hong Kong eller Japan
  • Ibland tillĂ„ter inte hostare anvĂ€ndning av hyrda servrar för CDN-Ă€ndamĂ„l. DĂ€rför, om du plötsligt bestĂ€mmer dig för att distribuera ett innehĂ„llsleveransnĂ€tverk som en tjĂ€nst, glöm inte att lĂ€sa reglerna för din specifika vĂ€rdleverantör i förvĂ€g
  • Utforska undervattenskommunikationskartaatt förestĂ€lla sig hur kontinenterna hĂ€nger ihop och ta hĂ€nsyn till detta nĂ€r man bygger ett nĂ€tverk för innehĂ„llsleverans
  • Försök kolla pingar frĂ„n olika stĂ€llen till dina servrar. PĂ„ sĂ„ sĂ€tt kan du se regionerna nĂ€rmast CDN-punkter och konfigurera GeoDNS mer korrekt
  • Beroende pĂ„ uppgifterna skulle det vara anvĂ€ndbart att anpassa Nginx för specifika cachningskrav och med hĂ€nsyn till belastningen pĂ„ servern. Artiklar om Nginx cache hjĂ€lpte mig mycket med detta - hĂ€r och acceleration av arbete under tung belastning: hĂ€r Đž hĂ€r

KĂ€lla: will.com