Vytvorenie a konfigurácia vášho CDN

Content Delivery Networks (CDN) sa na webových stránkach a aplikáciách používajú predovšetkým na urýchlenie načítania statických prvkov. Stáva sa to v dôsledku ukladania súborov do vyrovnávacej pamäte na serveroch CDN umiestnených v rôznych geografických oblastiach. Požiadaním o údaje cez CDN ich používateľ dostane z najbližšieho servera.

Princíp fungovania a funkčnosti všetkých sietí na doručovanie obsahu je približne rovnaký. Po prijatí žiadosti o stiahnutie súboru ho server CDN jednorazovo odoberie z pôvodného servera a odovzdá ho používateľovi, pričom ho na určitý čas uloží do vyrovnávacej pamäte. Všetky nasledujúce požiadavky sú zodpovedané z vyrovnávacej pamäte. Všetky CDN majú možnosti na predbežné načítanie súborov, vymazanie vyrovnávacej pamäte, nastavenie dátumu vypršania platnosti a ďalšie.

Stáva sa, že z jedného alebo druhého dôvodu potrebujete zorganizovať svoju vlastnú sieť na doručovanie obsahu a potom - nech nám pomôžu pokyny na zostavenie ďalšieho bicykla.

Vytvorenie a konfigurácia vášho CDN
Zdroj: Infographic vektor vytvorený pikisuperstar - www.freepik.com

Keď potrebujete vlastné CDN

Zvážte prípady, kedy má spustenie vlastného CDN zmysel:

  • keď existuje túžba ušetriť peniaze a prevádzkové náklady, aj keď používate lacné siete CDN, ako sú BunnyCDN vo výške niekoľko stoviek dolárov mesačne
  • ak chceme získať trvalú vyrovnávaciu pamäť alebo vyrovnávaciu pamäť bez susedov servera a kanála
  • Služby CDN nemajú body prítomnosti v regióne, ktorý potrebujete
  • potrebné špeciálne nastavenia doručovania obsahu
  • chceme urýchliť doručovanie dynamického obsahu umiestnením produkčného servera bližšie k používateľom
  • existuje obava, že služba CDN tretej strany môže nezákonne zhromažďovať alebo používať informácie o správaní používateľov (ahoj služby, ktoré nie sú v súlade s GDPR) alebo sa zapájať do iných nezákonných aktivít

Vo väčšine ostatných prípadov je vhodnejšie použiť existujúce hotové riešenia.

Čo potrebujete na začiatok

Je úžasné, ak máte svoj vlastný autonómny systém (AS). S ním môžete priradiť rovnakú IP viacerým serverom a podľa tohto návodu na úrovni siete nasmerujte používateľov na najbližšiu. Stojí za to povedať, že aj s blokom adries /24 je možné vybudovať sieť na doručovanie obsahu. Niektorí poskytovatelia serverov vám umožňujú urobiť oznámenie na použitie vo všetkých regiónoch, ktoré majú k dispozícii.

Ak nie ste šťastným vlastníkom bloku IP adries, na spustenie jednoduchého CDN budete potrebovať:

  • názov domény alebo subdoména
  • aspoň dva servery v rôznych regiónoch. Server môže byť dedikovaný alebo virtuálny
  • nástroj geoDNS. Pomocou neho bude používateľ po zadaní adresy domény presmerovaný na najbližší server

Zaregistrujte si doménu a objednajte si servery

S registráciou domény je všetko jednoduché – registrujeme sa v akejkoľvek zóne u ktoréhokoľvek registrátora. Môžete tiež použiť subdoménu pre CDN, napríklad niečo ako cdn.názov domény.com. V našom príklade to v skutočnosti urobíme.

Pokiaľ ide o objednávacie servery, mali by sa prenajať v regiónoch a krajinách, kde sa nachádza vaše používateľské publikum. Ak je projekt interkontinentálny, potom je vhodné zvoliť poskytovateľov hostingu, ktorí ponúkajú servery po celom svete naraz. Príklady: OVH, prenájom webu и 100 TB - pre dedikované servery, Vultr и DigitalOcean — pre virtuálny cloud*.

Pre naše súkromné ​​CDN si objednáme 3 virtuálne servery na rôznych kontinentoch. O Vultr na serveri pre 5 $/mes dostaneme 25GB SSD miesta a 1 TB prevádzky. Pri inštalácii vyberte najnovšiu verziu Debianu. Naše servery:

Vytvorenie a konfigurácia vášho CDN Frankfurt, ip: 199.247.18.199

Vytvorenie a konfigurácia vášho CDN Chicago, ip: 149.28.121.123

Vytvorenie a konfigurácia vášho CDN Singapore, ip: 157.230.240.216

*Vultr a DigitalOcean sľubujú kredit 100 USD používateľom, ktorí sa zaregistrujú prostredníctvom odkazov v článku ihneď po pridaní spôsobu platby. Autor z toho dostáva aj malú pochvalu, ktorá je pre neho teraz veľmi významná. Prosím o pochopenie.

Nastavenie geoDNS

Aby bol používateľ pri prístupe na doménu alebo subdoménu CDN presmerovaný na požadovaný (najbližší) server, potrebujeme DNS server s funkciou geoDNS.

Princíp a fungovanie geoDNS je nasledovné:

  1. Určuje adresu IP klienta, ktorý odoslal požiadavku DNS, alebo IP adresu rekurzívneho servera DNS, ktorý sa používa pri spracovaní požiadavky klienta. Takéto rekurzívne servery sú zvyčajne DNS poskytovateľov.
  2. IP klienta rozpoznáva jeho krajinu alebo región. Na to slúžia databázy GeoIP, ktorých je dnes veľké množstvo. Existujú dobré bezplatné možnosti.
  3. V závislosti od umiestnenia klienta mu dá IP adresu najbližšieho CDN servera.

DNS server s funkciou geoDNS môže byť zostaviť sami, ale je lepšie použiť hotové riešenia so sieťou serverov DNS po celom svete a Anycast zo škatule:

  • CloudDNS od 9.95 $/mes, tarifa GeoDNS, štandardne je jeden DNS Failover
  • Zilore od 25 $/mes, DNS Failover povolené
  • Amazonská cesta 53 od 35 $/mes za čistých 50 miliónov geografických požiadaviek. DNS Failover sa účtuje samostatne
  • DNS Made Easy od 125 $/mes, existuje 10 zlyhaní DNS
  • CloudFlare, Funkcia „Geo Riadenie“ je dostupná v podnikových plánoch

Pri objednávaní geoDNS by ste si mali dať pozor na počet požiadaviek zahrnutých v tarife a mať na pamäti, že skutočný počet požiadaviek na doménu môže niekoľkonásobne prekročiť očakávania. Milióny pavúkov, skenerov, spamerov a iných zlých duchov neúnavne pracujú.

Takmer všetky služby DNS obsahujú nepostrádateľnú službu pre budovanie CDN - DNS Failover. S jeho pomocou môžete nastaviť monitorovanie prevádzky vašich serverov a pri absencii známok života automaticky nahradiť adresu nefunkčného servera záložným v DNS odpovediach.

Na zostavenie nášho CDN použijeme CloudDNS, tarifa GeoDNS.

Pridajme do vášho osobného účtu novú zónu DNS s uvedením vašej domény. Ak budujeme CDN na subdoméne a hlavná doména sa už používa, potom ihneď po pridaní zóny nezabudnite pridať existujúce pracovné DNS záznamy. Ďalším krokom je vytvorenie niekoľkých záznamov A pre doménu / subdoménu CDN, z ktorých každý sa použije na nami špecifikovaný región. Ako regióny môžete určiť kontinenty alebo krajiny, podoblasti sú dostupné pre USA a Kanadu.

V našom prípade sa CDN vytvorí na subdoméne cdn.sayt.in. Pridaním zóny sayt.in, vytvorte prvý záznam A pre subdoménu a nasmerujte celú Severnú Ameriku na server v Chicagu:

Vytvorenie a konfigurácia vášho CDN
Zopakujme akciu pre ostatné oblasti, pričom nezabudnime vytvoriť jednu položku pre predvolené oblasti. Na konci sa stane toto:

Vytvorenie a konfigurácia vášho CDN

Posledná predvolená položka na snímke obrazovky znamená, že všetky nešpecifikované regióny (a to sú Európa, Afrika, používatelia satelitného internetu atď.) budú odoslané na server vo Frankfurte.

Týmto sa dokončí základné nastavenie DNS. Zostáva prejsť na webovú stránku registrátora domén a nahradiť súčasné doménové NS za tie, ktoré vydáva ClouDNS. A kým sa budú aktualizovať NS, pripravíme servery.

Inštalácia SSL certifikátov

Naše CDN bude fungovať cez HTTPS, takže ak už máte certifikáty SSL pre doménu alebo subdoménu, nahrajte ich na všetky servery, napríklad do adresára /etc/ssl/vasadomena/

Ak neexistujú žiadne certifikáty, môžete získať bezplatný od spoločnosti Let's Encrypt. Ideálne na to ACME Shellscript. Klient je pohodlný a ľahko sa nastavuje a čo je najdôležitejšie, umožňuje overiť doménu/subdoménu pomocou DNS cez API ClouDNS.

Acme.sh nainštalujeme len na jeden zo serverov – európsky 199.247.18.199, z ktorého sa skopírujú certifikáty na všetky ostatné. Ak chcete nainštalovať, spustite:

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

Počas inštalácie skriptu sa vytvorí CRON job pre ďalšiu obnovu certifikátov bez našej účasti.

Pri vydávaní certifikátu bude doména skontrolovaná pomocou DNS pomocou API, takže v osobnom účte ClouDNS v menu Reseller API je potrebné vytvoriť nové používateľské API a nastaviť preň heslo. Výsledné auth-id s heslom sa zapíše do súboru ~/.acme.sh/dnsapi/dns_cloudns.sh (nezamieňať so súborom dns_clouddns.sh). Tu sú riadky, ktoré je potrebné odkomentovať a upraviť:

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<пароль>"

Teraz požiadame o certifikát SSL pre cdn.sayt.in

root@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"

V možnostiach sme pre budúcnosť špecifikovali príkaz na automatické opätovné načítanie konfigurácie web servera po každom obnovení doby platnosti certifikátu v budúcnosti.

Celý proces získania certifikátu môže trvať do 2 minút, neprerušujte ho. Ak sa vyskytne chyba overenia domény, skúste príkaz spustiť znova. Na konci uvidíme, kde boli certifikáty nahrané:

Vytvorenie a konfigurácia vášho CDN

Zapamätajte si tieto cesty, bude potrebné ich zadať pri kopírovaní certifikátu na iné servery, ako aj v nastaveniach webového servera. Nevenujeme pozornosť chybe opätovného načítania konfigurácií Nginx - pri aktualizácii certifikátov nebude na plne nakonfigurovanom serveri.

Pre SSL nám zostáva len skopírovať prijatý certifikát na dva ďalšie servery pri zachovaní cesty k súborom. Na každom z nich vytvorte rovnaké adresáre a vytvorte kópiu:

root@cdn:~# mkdir -p /root/.acme.sh/cdn.sayt.in/
root@cdn:~# scp -r [email protected]:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/

Ak chcete certifikáty pravidelne aktualizovať, vytvorte dennú úlohu CRON na oboch serveroch pomocou príkazu:

scp -r [email protected]:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

V tomto prípade musí byť nakonfigurovaný prístup k vzdialenému zdrojovému serveru kľúčom, t.j. bez zadania hesla. Nezabudnite to urobiť.

Inštalácia a konfigurácia Nginx

Na poskytovanie statického obsahu použijeme Nginx nakonfigurovaný ako cachovací proxy server. Aktualizujte zoznamy balíkov a nainštalujte ich na všetky tri servery:

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

Namiesto predvoleného nastavenia používame konfiguráciu zo spojlera nižšie:
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;
    }
  }
}

Upravte v konfigurácii:

  • max_size — veľkosť vyrovnávacej pamäte, ktorá nepresahuje dostupné miesto na disku
  • neaktívne - čas uloženia údajov uložených vo vyrovnávacej pamäti, ku ktorým nikto nepristupoval
  • ssl_certificate и ssl_certificate_key — cesty k certifikátom SSL a súborom kľúčov
  • proxy_cache_valid - čas uloženia údajov z vyrovnávacej pamäte
  • proxy_pass — adresa pôvodného servera, z ktorého bude CDN požadovať súbory na ukladanie do vyrovnávacej pamäte. V našom príklade toto sayt.in

Ako vidíte, všetko je jednoduché. Ťažkosti môžu vzniknúť len pri nastavovaní času ukladania do vyrovnávacej pamäte kvôli podobnosti smerníc neaktívne и proxy_cache_valid. Poďme si ich analyzovať na našom príklade. Tu je to, čo sa stane, keď neaktívne = 7 d и proxy_cache_valid 90d:

  • ak sa požiadavka nezopakuje do 7 dní, potom budú údaje po uplynutí tejto doby z cache vymazané
  • ak sa požiadavka opakuje aspoň raz za 7 dní, údaje vo vyrovnávacej pamäti budú po 90 dňoch považované za zastarané a Nginx ich aktualizuje pri ďalšej požiadavke, pričom ich prevezme z pôvodného servera

Úprava dokončená nginx.conf, znova načítaj konfiguráciu:

root@cdn:~# service nginx reload

Naše CDN je pripravené. Za 15 $/mes. získali sme body prítomnosti na troch kontinentoch a 3 TB návštevnosti: 1 TB v každej lokalite.

Kontrola práce CDN

Pozrime sa na pingy na naše CDN z rôznych geografických lokalít. Na to bude fungovať akákoľvek služba ping.

Štartovací bod
Hostiteľ
IP
Priemerný čas, ms

Nemecko Berlín
cdn.sayt.in
199.247.18.199
9.6

Holandsko, Amsterdam
cdn.sayt.in
199.247.18.199
10.1

Francúzsko Paríž
cdn.sayt.in
199.247.18.199
16.3

Veľká Británia, Londýn
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

Japonsko Tokio
cdn.sayt.in
157.230.240.216
74.8

Austrália, Sydney
cdn.sayt.in
157.230.240.216
95.9

Výsledky sú dobré. Teraz umiestnime testovací obrázok do koreňového adresára hlavnej stránky test.jpg a skontrolujte rýchlosť sťahovania cez CDN. Hovorí sa - vyrobené. Obsah je doručený rýchlo.

Napíšme si malý skript pre prípad, že by sme chceli vyčistiť vyrovnávaciu pamäť na bode CDN.
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

Ak chcete odstrániť celú vyrovnávaciu pamäť, stačí ju spustiť, samostatný súbor je možné vyčistiť takto:

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

Namiesto záverov

Na záver by som chcel dať niekoľko užitočných rád, aby som okamžite prekonal hrable, z ktorých ma vtedy bolela hlava:

  • Na zvýšenie odolnosti CDN voči chybám sa odporúča nakonfigurovať službu DNS Failover, ktorá pomáha rýchlo zmeniť záznam A v prípade zlyhania servera. Toto sa vykonáva v ovládacom paneli DNS záznamov domény.
  • Stránky so širokým geografickým pokrytím nepochybne vyžadujú veľké množstvo CDN, ale nebuďme fanatickí. Používateľ si s najväčšou pravdepodobnosťou nevšimne významný rozdiel v porovnaní s plateným CDN, ak umiestnite servery na 6-7 miestach: Európa, Severná Amerika (východ), Severná Amerika (západ), Singapur, Austrália, Hong Kong alebo Japonsko.
  • Hostitelia niekedy nepovoľujú používanie prenajatých serverov na účely CDN. Ak sa teda zrazu rozhodnete nasadiť sieť na doručovanie obsahu ako službu, nezabudnite si vopred prečítať pravidlá konkrétneho poskytovateľa hostingu
  • Preskúmať podvodná komunikačná mapareprezentovať, ako sú kontinenty prepojené, a brať to do úvahy pri budovaní siete na doručovanie obsahu
  • Skúste skontrolovať pingy z rôznych miest na vaše servery. Týmto spôsobom môžete vidieť regióny najbližšie k bodom CDN a správne nakonfigurovať GeoDNS
  • V závislosti od úloh bude užitočné doladiť Nginx pre špecifické požiadavky na ukladanie do vyrovnávacej pamäte a berúc do úvahy zaťaženie servera. V tomto mi veľmi pomohli články o vyrovnávacej pamäti Nginx - tu a zrýchlenie práce pri veľkom zaťažení: tu и tu

Zdroj: hab.com