Vytvoření a konfigurace vašeho CDN

Content Delivery Networks (CDN) se na webech a aplikacích používají především k urychlení načítání statických prvků. K tomu dochází v důsledku ukládání souborů do mezipaměti na serverech CDN umístěných v různých geografických oblastech. Vyžádáním dat přes CDN je uživatel obdrží z nejbližšího serveru.

Princip fungování a funkčnost všech sítí pro doručování obsahu je přibližně stejný. Po obdržení požadavku na stažení souboru jej CDN server jednorázově převezme z původního serveru a předá jej uživateli a zároveň jej uloží do mezipaměti po určenou dobu. Všechny následující požadavky jsou zodpovězeny z mezipaměti. Všechny CDN mají možnosti pro předběžné načtení souborů, vymazání mezipaměti, nastavení data vypršení platnosti a další.

Stává se, že z toho či onoho důvodu potřebujete zorganizovat svou vlastní síť pro doručování obsahu, a pak - ať nám pomůže návod na sestavení dalšího kola.

Vytvoření a konfigurace vašeho CDN
Zdroj: Infographic vektor vytvořený pikisuperstar - www.freepik.com

Když potřebujete vlastní CDN

Zvažte případy, kdy provozování vlastního CDN dává smysl:

  • když je touha ušetřit peníze a provozní náklady i při použití levných CDN, jako jsou BunnyCDN ve výši několika set dolarů měsíčně
  • pokud chceme získat trvalou mezipaměť nebo mezipaměť bez sousedů serveru a kanálu
  • Služby CDN nemají body přítomnosti v regionu, který potřebujete
  • jakákoli potřebná speciální nastavení doručování obsahu
  • chceme urychlit doručování dynamického obsahu umístěním produkčního serveru blíže uživatelům
  • existuje obava, že služba CDN třetí strany může nezákonně shromažďovat nebo používat informace o chování uživatelů (ahoj služby, které nejsou v souladu s GDPR) nebo se zapojit do jiných nezákonných aktivit

Ve většině ostatních případů je vhodnější použít stávající hotová řešení.

Co potřebujete pro začátek

Je skvělé, pokud máte svůj vlastní autonomní systém (AS). S ním můžete přiřadit stejnou IP několika serverům a podle tohoto návodu na úrovni sítě nasměrujte uživatele na nejbližší. Stojí za zmínku, že i s adresovým blokem /24 je možné vybudovat síť pro doručování obsahu. Někteří poskytovatelé serverů vám umožňují učinit oznámení pro použití ve všech jim dostupných oblastech.

Pokud nejste šťastným vlastníkem bloku IP adres, pak ke spuštění jednoduchého CDN budete potřebovat:

  • název domény nebo subdoména
  • alespoň dva servery v různých regionech. Server může být dedikovaný nebo virtuální
  • nástroj geoDNS. S ním bude uživatel, který adresuje doménu, přesměrován na nejbližší server

Zaregistrujte si doménu a objednejte servery

S registrací domény je vše jednoduché – registrujeme se v jakékoli zóně u jakéhokoli registrátora. Můžete také použít subdoménu pro CDN, například něco jako cdn.domainname.com. Ve skutečnosti v našem příkladu uděláme právě to.

Pokud jde o objednávání serverů, měly by být pronajímány v regionech a zemích, kde se nachází vaše uživatelské publikum. Pokud je projekt mezikontinentální, pak je vhodné zvolit poskytovatele hostingu, kteří nabízejí servery po celém světě najednou. Příklady: OVH, pronájem webu и 100 TB - pro dedikované servery, Vultr и DigitalOcean — pro virtuální cloud*.

Pro naše privátní CDN objednáme 3 virtuální servery na různých kontinentech. Na Vultr na serveru pro 5 $/měs dostaneme 25GB SSD místa a 1 TB provozu. Při instalaci vyberte nejnovější Debian. Naše servery:

Vytvoření a konfigurace vašeho CDN Frankfurt, ip: 199.247.18.199

Vytvoření a konfigurace vašeho CDN Chicago, ip: 149.28.121.123

Vytvoření a konfigurace vašeho CDN Singapore, ip: 157.230.240.216

* Společnosti Vultr a DigitalOcean slibují kredit 100 $ uživatelům, kteří se zaregistrují prostřednictvím odkazů v článku ihned po přidání platební metody. Autor z toho dostává i malou pochvalu, která je pro něj nyní velmi příznačná. Prosím o pochopení.

Nastavení geoDNS

Aby byl uživatel při přístupu na doménu nebo subdoménu CDN přesměrován na požadovaný (nejbližší) server, potřebujeme DNS server s funkcí geoDNS.

Princip a fungování geoDNS je následující:

  1. Určuje IP klienta, který odeslal požadavek DNS, nebo IP rekurzivního serveru DNS, který se používá při zpracování požadavku klienta. Takové rekurzivní servery jsou obvykle DNS poskytovatelů.
  2. IP klienta rozpoznává jeho zemi nebo region. K tomu slouží GeoIP databáze, kterých je dnes velké množství. Existují dobré bezplatné možnosti.
  3. V závislosti na umístění klienta mu dá IP adresu nejbližšího CDN serveru.

DNS server s funkcí geoDNS může být sestavit sami, ale je lepší používat hotová řešení se sítí DNS serverů po celém světě a Anycast z krabice:

  • CloudDNS z 9.95 $/měs, tarif GeoDNS, standardně je jeden DNS Failover
  • Zilore z 25 $/měs, DNS Failover povoleno
  • Amazonská cesta 53 z 35 $/měs za čistých 50 milionů geografických požadavků. DNS Failover se účtuje zvlášť
  • DNS snadno z 125 $/měs, existuje 10 selhání DNS
  • Cloudflare, Funkce "Geo Steering" je k dispozici v plánech Enterprise

Při objednávání geoDNS byste měli věnovat pozornost počtu požadavků zahrnutých v tarifu a mít na paměti, že skutečný počet požadavků na doménu může několikanásobně předčit očekávání. Miliony pavouků, skenerů, spammerů a dalších zlých duchů neúnavně pracují.

Téměř všechny služby DNS obsahují nepostradatelnou službu pro budování CDN - DNS Failover. S jeho pomocí si můžete nastavit sledování provozu vašich serverů a při absenci známek života automaticky nahradit v DNS odpovědích adresu nefunkčního serveru za záložní.

K vytvoření našeho CDN použijeme CloudDNS, tarif GeoDNS.

Pojďme přidat novou zónu DNS do vašeho osobního účtu s uvedením vaší domény. Pokud budujeme CDN na subdoméně a hlavní doména je již používána, pak ihned po přidání zóny nezapomeňte přidat stávající funkční DNS záznamy. Dalším krokem je vytvoření několika A-záznamů pro CDN doménu / subdoménu, z nichž každý bude aplikován na region, který jsme zadali. Jako regiony můžete určit kontinenty nebo země, podoblasti jsou dostupné pro USA a Kanadu.

V našem případě bude CDN vytvořena na subdoméně cdn.sayt.in. Přidáním zóny sayt.in, vytvořte první záznam A pro subdoménu a nasměrujte celou Severní Ameriku na server v Chicagu:

Vytvoření a konfigurace vašeho CDN
Zopakujme akci pro další oblasti a nezapomeňme vytvořit jednu položku pro výchozí oblasti. Co se stane na konci:

Vytvoření a konfigurace vašeho CDN

Poslední výchozí položka na snímku obrazovky znamená, že všechny nespecifikované regiony (a to jsou Evropa, Afrika, uživatelé satelitního internetu atd.) budou odeslány na server ve Frankfurtu.

Tím je základní nastavení DNS dokončeno. Zbývá přejít na stránky registrátora domén a nahradit stávající doménové NS těmi, které vydává ClouDNS. A zatímco se budou aktualizovat NS, připravíme servery.

Instalace SSL certifikátů

Naše CDN bude fungovat přes HTTPS, takže pokud již máte certifikáty SSL pro doménu nebo subdoménu, nahrajte je na všechny servery, například do adresáře /etc/ssl/vasedomena/

Pokud certifikáty neexistují, můžete získat zdarma jeden od Let's Encrypt. Na to ideální ACME Shellscript. Klient je pohodlný a snadno se nastavuje a hlavně umožňuje validovat doménu/subdoménu pomocí DNS přes ClouDNS API.

Acme.sh nainstalujeme pouze na jeden ze serverů - evropský 199.247.18.199, ze kterého budou certifikáty zkopírovány na všechny ostatní. Chcete-li nainstalovat, spusťte:

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

Během instalace skriptu bude vytvořena úloha CRON pro další obnovu certifikátů bez naší účasti.

Při vydávání certifikátu bude doména zkontrolována pomocí DNS pomocí API, takže v osobním účtu ClouDNS v nabídce Reseller API je potřeba vytvořit nové uživatelské API a nastavit pro něj heslo. Výsledné auth-id s heslem bude zapsáno do souboru ~/.acme.sh/dnsapi/dns_cloudns.sh (neplést se souborem dns_clouddns.sh). Zde jsou řádky, které je třeba odkomentovat a upravit:

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

Nyní požádáme o SSL certifikát pro cdn.sayt.in

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

V možnostech jsme pro budoucnost určili příkaz pro automatické opětovné načtení konfigurace web serveru po každém obnovení doby platnosti certifikátu v budoucnu.

Celý proces získání certifikátu může trvat až 2 minuty, nepřerušujte jej. Pokud dojde k chybě ověření domény, zkuste příkaz spustit znovu. Na konci uvidíme, kam byly certifikáty nahrány:

Vytvoření a konfigurace vašeho CDN

Pamatujte si tyto cesty, bude nutné je zadat při kopírování certifikátu na jiné servery a také v nastavení webového serveru. Chybě při opětovném načítání konfigurací Nginx nevěnujeme pozornost - při aktualizaci certifikátů nebude na plně nakonfigurovaném serveru.

Pro SSL nám zbývá pouze zkopírovat přijatý certifikát na dva další servery při zachování cesty k souborům. Vytvořme stejné adresáře na každém z nich a udělejme kopii:

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/

Chcete-li certifikáty pravidelně aktualizovat, vytvořte denní úlohu CRON na obou serverech pomocí příkazu:

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

V tomto případě musí být nakonfigurován přístup ke vzdálenému zdrojovému serveru podle klíče, tj. bez zadání hesla. Nezapomeňte to udělat.

Instalace a konfigurace Nginx

K poskytování statického obsahu použijeme Nginx nakonfigurovaný jako mezipaměťový proxy server. Aktualizujte seznamy balíčků a nainstalujte je na všechny tři servery:

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

Místo výchozího nastavení používáme konfiguraci ze spoileru níže:
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;
    }
  }
}

Upravit v konfiguraci:

  • max_size — velikost mezipaměti nepřesahující dostupné místo na disku
  • neaktivní - doba uložení dat uložených v mezipaměti, ke kterým nikdo neměl přístup
  • ssl_certificate и ssl_certificate_key — cesty k certifikátům SSL a souborům klíčů
  • proxy_cache_valid - doba uložení dat uložených v mezipaměti
  • proxy_pass — adresa původního serveru, ze kterého bude CDN požadovat soubory pro ukládání do mezipaměti. V našem příkladu toto sayt.in

Jak vidíte, vše je jednoduché. Potíže mohou nastat pouze při nastavení doby ukládání do mezipaměti kvůli podobnosti směrnic neaktivní и proxy_cache_valid. Pojďme je analyzovat na našem příkladu. Zde je to, co se stane, když neaktivní=7d и proxy_cache_valid 90d:

  • pokud se požadavek do 7 dnů nezopakuje, pak budou data po uplynutí této doby z cache vymazána
  • pokud se požadavek opakuje alespoň jednou za 7 dní, data v mezipaměti budou po 90 dnech považována za zastaralá a Nginx je aktualizuje s dalším požadavkem a vezme je z původního serveru

Úpravy dokončeny nginx.conf, znovu načtěte konfiguraci:

root@cdn:~# service nginx reload

Naše CDN je připraveno. Za 15 $/měs. získali jsme body přítomnosti na třech kontinentech a 3 TB provozu: 1 TB v každé lokalitě.

Kontrola práce CDN

Podívejme se na pingy na naše CDN z různých geografických míst. K tomu bude fungovat jakákoli služba ping.

Startovní bod
Hostitel
IP
Průměrný čas, ms

Německo Berlín
cdn.sayt.in
199.247.18.199
9.6

Nizozemsko, Amsterdam
cdn.sayt.in
199.247.18.199
10.1

Francie Paříž
cdn.sayt.in
199.247.18.199
16.3

Velká Británie, 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álie, Sydney
cdn.sayt.in
157.230.240.216
95.9

Výsledky jsou dobré. Nyní umístíme testovací obrázek do kořenového adresáře hlavního webu test.jpg a zkontrolujte jeho rychlost stahování přes CDN. Říká se - hotovo. Obsah je doručen rychle.

Napíšeme si malý skript pro případ, že bychom chtěli vymazat mezipaměť na CDN bodu.
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

Chcete-li smazat celou mezipaměť, stačí ji spustit, samostatný soubor lze vyčistit takto:

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

Namísto závěrů

Nakonec bych chtěl dát několik užitečných tipů, abych mohl okamžitě překročit hrábě, ze kterého mě tehdy bolela hlava:

  • Pro zvýšení odolnosti CDN proti chybám se doporučuje nakonfigurovat DNS Failover, který pomáhá rychle změnit záznam A v případě poruchy serveru. To se provádí v ovládacím panelu DNS záznamy domény.
  • Stránky s širokým geografickým pokrytím bezpochyby vyžadují velké množství CDN, ale nebuďme fanatičtí. S největší pravděpodobností uživatel nezaznamená významný rozdíl ve srovnání s placenou CDN, pokud umístíte servery do 6-7 míst: Evropa, Severní Amerika (východ), Severní Amerika (západ), Singapur, Austrálie, Hong Kong nebo Japonsko.
  • Někdy hostitelé nepovolují použití pronajatých serverů pro účely CDN. Pokud se tedy náhle rozhodnete nasadit jako službu síť pro doručování obsahu, nezapomeňte si předem přečíst pravidla konkrétního poskytovatele hostingu
  • Prozkoumat podvodní komunikační mapareprezentovat, jak jsou kontinenty propojeny, a vzít to v úvahu při budování sítě pro doručování obsahu
  • Zkuste zkontrolovat pingy z různých míst na vaše servery. Tímto způsobem můžete vidět regiony nejblíže bodům CDN a správněji nakonfigurovat GeoDNS
  • V závislosti na úkolech bude užitečné Nginx doladit pro konkrétní požadavky na ukládání do mezipaměti a s ohledem na zatížení serveru. V tom mi hodně pomohly články o Nginx cache - zde a zrychlení práce při velkém zatížení: zde и zde

Zdroj: www.habr.com