Bou en konfigureer jou CDN

Content Delivery Networks (CDN's) word hoofsaaklik in webwerwe en toepassings gebruik om die laai van statiese elemente te bespoedig. Dit gebeur as gevolg van die kas van lêers op CDN-bedieners wat in verskillende geografiese streke geleë is. Deur data via CDN aan te vra, ontvang die gebruiker dit vanaf die naaste bediener.

Die beginsel van werking en funksionaliteit van alle inhoudafleweringsnetwerke is ongeveer dieselfde. Nadat 'n versoek ontvang is om 'n lêer af te laai, neem die CDN-bediener dit eenmalig van die oorspronklike bediener af en gee dit aan die gebruiker, en kas dit terselfdertyd vir 'n bepaalde tydperk. Alle daaropvolgende versoeke word vanuit die kas beantwoord. Alle CDN's het opsies om lêers vooraf te laai, die kas skoon te maak, die vervaldatum in te stel, en meer.

Dit gebeur dat u om een ​​of ander rede u eie inhoudafleweringsnetwerk moet organiseer, en dan - laat die instruksies vir die samestelling van die volgende fiets vir ons van hulp wees.

Bou en konfigureer jou CDN
Bron: Infografiese vektor geskep deur pikisuperstar - www.freepik.com

Wanneer jy jou eie CDN nodig het

Oorweeg die gevalle waar die bestuur van jou eie CDN sin maak:

  • wanneer daar 'n begeerte is om geld te spaar, en bedryfskoste selfs wanneer goedkoop CDN's soos gebruik word BunnyCDN 'n paar honderd dollar per maand beloop
  • as ons 'n permanente kas of 'n kas sonder bediener- en kanaalbure wil kry
  • CDN-dienste het nie punte van teenwoordigheid in die streek wat u benodig nie
  • enige spesiale inhoud aflewering instellings vereis
  • ons wil die lewering van dinamiese inhoud bespoedig deur die produksiebediener nader aan gebruikers te plaas
  • daar is 'n kommer dat 'n derdeparty CDN-diens onwettig inligting oor gebruikersgedrag kan insamel of gebruik (hallo dienste wat nie aan die GDPR voldoen) of betrokke kan raak by ander onwettige aktiwiteite

In die meeste ander gevalle is dit meer gepas om bestaande klaargemaakte oplossings te gebruik.

Wat het jy nodig om te begin

Dit is wonderlik as jy jou eie outonome stelsel (AS) het. Daarmee kan u dieselfde IP aan verskeie bedieners toewys en volgens hierdie instruksie op netwerkvlak, rig gebruikers na die naaste een. Dit is die moeite werd om te sê dat dit selfs met die /24-adresblok moontlik is om 'n inhoudafleweringsnetwerk te bou. Sommige bedienerverskaffers laat jou toe om 'n aankondiging te maak vir gebruik in alle streke wat aan hulle beskikbaar is.

As jy nie 'n gelukkige eienaar van 'n blok IP-adresse is nie, sal jy nodig hê om 'n eenvoudige CDN uit te voer:

  • domeinnaam of subdomein
  • ten minste twee bedieners in verskillende streke. Die bediener kan óf toegewyd óf virtueel wees
  • geoDNS-instrument. Daarmee sal die gebruiker, wat die domein aangespreek het, na die naaste bediener verwys word

Registreer 'n domein en bestel bedieners

Met domeinregistrasie is alles eenvoudig - ons registreer in enige sone by enige registrateur. U kan ook 'n subdomein vir 'n CDN gebruik, byvoorbeeld iets soos cdn.domainname.com. Eintlik, in ons voorbeeld, sal ons dit doen.

Wat die bestel van bedieners betref, moet dit gehuur word in die streke en lande waar u gebruikersgehoor geleë is. As die projek interkontinentaal is, is dit gerieflik om gasheerverskaffers te kies wat gelyktydig bedieners oor die hele wêreld aanbied. Voorbeelde: OVH, huur web и 100Tb - vir toegewyde bedieners, Vultr и DigitalOcean - vir virtuele wolk*.

Vir ons private CDN sal ons 3 virtuele bedieners op verskillende kontinente bestel. By Vultr op die bediener vir $5/maand ons sal kry 25GB SSD plekke en 1TB verkeer. Wanneer jy installeer, kies die nuutste Debian. Ons bedieners:

Bou en konfigureer jou CDN Frankfurt, IP: 199.247.18.199

Bou en konfigureer jou CDN Chicago, IP: 149.28.121.123

Bou en konfigureer jou CDN Singapoer, IP: 157.230.240.216

* Vultr en DigitalOcean beloof $100-krediet aan gebruikers wat deur die skakels in die artikel registreer onmiddellik nadat 'n betaalmetode bygevoeg is. Die skrywer kry ook 'n klein kompliment hieruit, wat nou vir hom baie betekenisvol is. Wees asseblief begripvol.

Stel geoDNS op

Om die gebruiker na die verlangde (naaste) bediener te stuur wanneer hy toegang tot 'n domein of CDN-subdomein kry, benodig ons 'n DNS-bediener met die geoDNS-funksie.

Die beginsel en werking van geoDNS is soos volg:

  1. Spesifiseer die IP van die kliënt wat die DNS-versoek gestuur het, of die IP van die rekursiewe DNS-bediener wat gebruik word wanneer die kliëntversoek verwerk word. Sulke rekursiewe bedieners is gewoonlik DNS-s van verskaffers.
  2. Die IP van die kliënt erken sy land of streek. Hiervoor word GeoIP-databasisse gebruik, waarvan daar vandag baie is. Daar is goeie gratis opsies.
  3. Gee hom die IP-adres van die naaste CDN-bediener, afhangende van die ligging van die kliënt.

DNS-bediener met geoDNS-funksie kan wees self bymekaar maak, maar dit is beter om klaargemaakte oplossings te gebruik met 'n netwerk van DNS-bedieners regoor die wêreld en anycast uit die boks:

  • SlouDNS van $9.95/maand, GeoDNS-tarief, by verstek is daar een DNS Failover
  • Zilore van $25/maand, DNS Failover geaktiveer
  • Amazon Roete 53 van $35/maand vir 'n netto 50M geo-versoeke. DNS Failover word afsonderlik gefaktureer
  • DNS maklik gemaak van $125/maand, daar is 10 DNS-failovers
  • Cloudflare, "Geo Steering" funksie is beskikbaar in Enterprise planne

Wanneer u geoDNS bestel, moet u aandag gee aan die aantal versoeke wat by die tarief ingesluit is en in gedagte hou dat die werklike aantal versoeke na die domein die verwagtinge verskeie kere kan oorskry. Miljoene spinnekoppe, skandeerders, spammers en ander bose geeste werk onvermoeid.

Byna alle DNS-dienste bevat 'n onontbeerlike diens vir die bou van 'n CDN - DNS Failover. Met sy hulp kan u die monitering van die werking van u bedieners opstel en, in die afwesigheid van tekens van lewe, outomaties die adres van 'n nie-werkende bediener vervang met 'n rugsteun-een in DNS-antwoorde.

Om ons CDN te bou, sal ons gebruik CloudDNS, GeoDNS-tarief.

Kom ons voeg 'n nuwe DNS-sone by jou persoonlike rekening, wat jou domein spesifiseer. As ons 'n CDN op 'n subdomein bou, en die hoofdomein is reeds in gebruik, moet u nie vergeet om die bestaande werkende DNS-rekords onmiddellik na die byvoeging van die sone by te voeg nie. Die volgende stap is om verskeie A-rekords vir die CDN-domein / subdomein te skep, wat elkeen toegepas sal word op die streek wat ons gespesifiseer het. U kan kontinente of lande as streke spesifiseer, substreke is beskikbaar vir die VSA en Kanada.

In ons geval sal die CDN op 'n subdomein verhoog word cdn.sayt.in. Deur 'n sone by te voeg sê.in, skep die eerste A-rekord vir die subdomein en wys die hele Noord-Amerika na die bediener in Chicago:

Bou en konfigureer jou CDN
Kom ons herhaal die aksie vir ander streke, en onthou om een ​​inskrywing vir die verstekstreke te skep. Hier is wat op die ou end gebeur:

Bou en konfigureer jou CDN

Die laaste verstekinskrywing in die skermkiekie beteken dat alle ongespesifiseerde streke (en dit is Europa, Afrika, satelliet-internetgebruikers, ens.) na die bediener in Frankfurt gestuur sal word.

Dit voltooi die basiese DNS-opstelling. Dit bly om na die webwerf van die domeinregistrateur te gaan en die huidige domein-NS'e te vervang met dié wat deur ClouDNS uitgereik is. En terwyl die NS'e opgedateer sal word, sal ons die bedieners voorberei.

Installasie van SSL-sertifikate

Ons CDN sal oor HTTPS werk, so as jy reeds SSL-sertifikate vir 'n domein of subdomein het, laai dit op na alle bedieners, byvoorbeeld na die gids /etc/ssl/joudomein/

As daar geen sertifikate is nie, kan jy 'n gratis een by Let's Encrypt kry. Perfek hiervoor ACME Shellscript. Die kliënt is gerieflik en maklik om op te stel, en bowenal, dit laat jou toe om 'n domein/subdomein deur DNS via die ClouDNS API te valideer.

Ons sal acme.sh op slegs een van die bedieners installeer - Europese 199.247.18.199, waarvandaan sertifikate na al die ander gekopieer sal word. Om te installeer, hardloop:

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

Tydens die installering van die skrif sal 'n CRON-werk geskep word vir verdere hernuwing van sertifikate sonder ons deelname.

Wanneer 'n sertifikaat uitgereik word, sal die domein nagegaan word met behulp van DNS met behulp van die API, dus in die ClouDNS persoonlike rekening in die Reseller API-kieslys, moet jy 'n nuwe gebruikers-API skep en 'n wagwoord daarvoor instel. Die gevolglike outoriteit-ID met 'n wagwoord sal in die lêer geskryf word ~/.acme.sh/dnsapi/dns_cloudns.sh (moet nie verwar word met lêer nie dns_clouddns.sh). Hier is die reëls wat nie kommentaar gelewer en geredigeer moet word nie:

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

Nou sal ons 'n SSL-sertifikaat vir cdn.sayt.in

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

In die opsies, vir die toekoms, het ons 'n opdrag gespesifiseer om die webbedienerkonfigurasie outomaties te herlaai na elke hernuwing van die sertifikaatgeldigheidstydperk in die toekoms.

Die hele proses om 'n sertifikaat te bekom kan tot 2 minute neem, moenie dit onderbreek nie. As 'n domeinvalideringsfout voorkom, probeer weer om die opdrag uit te voer. Aan die einde sal ons sien waar die sertifikate opgelaai is:

Bou en konfigureer jou CDN

Onthou hierdie paaie, hulle sal gespesifiseer moet word wanneer die sertifikaat na ander bedieners gekopieer word, sowel as in die webbedienerinstellings. Ons gee nie aandag aan die fout om Nginx-konfigurasies te herlaai nie - dit sal nie op 'n volledig gekonfigureerde bediener wees wanneer sertifikate opgedateer word nie.

Al wat ons oor het vir SSL is om die ontvangde sertifikaat na twee ander bedieners te kopieer terwyl die pad na die lêers behou word. Kom ons skep dieselfde dopgehou op elkeen van hulle en maak 'n kopie:

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/

Om sertifikate gereeld op te dateer, skep 'n daaglikse CRON-taak op beide bedieners met die opdrag:

scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

In hierdie geval moet toegang tot die afgeleë bronbediener gekonfigureer word per sleutel, d.w.s. sonder om 'n wagwoord in te voer. Moenie vergeet om dit te doen nie.

Installeer en konfigureer Nginx

Om statiese inhoud te bedien, sal ons Nginx gebruik wat as 'n kasinstaanbediener gekonfigureer is. Dateer die pakketlyste op en installeer dit op al drie bedieners:

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

In plaas van die verstek, gebruik ons ​​die konfigurasie vanaf die bederf hieronder:
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;
    }
  }
}

Wysig in die konfigurasie:

  • maksimum_grootte — die grootte van die kas, wat nie die beskikbare skyfspasie oorskry nie
  • onaktiewe - bergingstyd van data in die kas waartoe niemand toegang het nie
  • ssl_sertifikaat и ssl_sertifikaat_sleutel - paaie na SSL-sertifikaat en sleutellêers
  • proxy_cache_valid - stoor tyd van gekas data
  • proxy_pass - adres van die oorspronklike bediener waarvandaan die CDN lêers vir kas sal versoek. In ons voorbeeld, dit sê.in

Soos u kan sien, is alles eenvoudig. Moeilikheid kan slegs ontstaan ​​om die kastyd in te stel as gevolg van die ooreenkomste van die riglyne onaktiewe и proxy_cache_valid. Kom ons ontleed hulle met ons voorbeeld. Hier is wat wanneer gebeur onaktief=7d и proxy_cache_valid 90d:

  • as die versoek nie binne 7 dae herhaal word nie, sal die data na hierdie tydperk uit die kas verwyder word
  • as die versoek ten minste een keer elke 7 dae herhaal word, sal die data in die kas na 90 dae as verouderd beskou word en met die volgende versoek sal Nginx dit opdateer en dit van die oorspronklike bediener af neem

Klaar om te wysig nginx.conf, herlaai die konfigurasie:

root@cdn:~# service nginx reload

Ons CDN is gereed. Vir $15/maand. ons het punte van teenwoordigheid op drie vastelande ontvang en 3 TB verkeer: 1 TB op elke plek.

Kontroleer die werk van CDN

Kom ons kyk na die pings na ons CDN vanaf verskillende geografiese liggings. Enige ping-diens sal hiervoor werk.

Beginpunt
Gasheer
IP
Gem. tyd, me

Duitsland Berlyn
cdn.sayt.in
199.247.18.199
9.6

Nederland, Amsterdam
cdn.sayt.in
199.247.18.199
10.1

Frankryk Parys
cdn.sayt.in
199.247.18.199
16.3

Groot-Brittanje, Londen
cdn.sayt.in
199.247.18.199
14.9

Kanada, Toronto
cdn.sayt.in
149.28.121.123
16.2

VSA, San Francisco
cdn.sayt.in
149.28.121.123
52.7

VSA, Dallas
cdn.sayt.in
149.28.121.123
23.1

VSA, Chicago
cdn.sayt.in
149.28.121.123
2.6

VSA, New York
cdn.sayt.in
149.28.121.123
19.8

Singapoer
cdn.sayt.in
157.230.240.216
1.7

Japan Tokio
cdn.sayt.in
157.230.240.216
74.8

Australië, Sydney
cdn.sayt.in
157.230.240.216
95.9

Die resultate is goed. Nou sal ons 'n toetsbeeld in die wortel van die hoofwebwerf plaas toets.jpg en kontroleer die aflaaispoed daarvan via CDN. Daar word gesê - gedoen. Inhoud word vinnig afgelewer.

Kom ons skryf 'n klein skrif vir ingeval ons die kas op die CDN-punt wil skoonmaak.
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

Om die hele kas uit te vee, hardloop dit net, 'n aparte lêer kan soos volg skoongemaak word:

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

In plaas van gevolgtrekkings

Ten slotte wil ek 'n paar nuttige wenke gee om dadelik oor die hark te trap wat my kop destyds seer gemaak het:

  • Om die fouttoleransie van die CDN te verhoog, word dit aanbeveel om DNS Failover op te stel, wat help om die A-rekord vinnig te verander in die geval van 'n bedieneronderbreking. Dit word gedoen in die DNS-rekords van die beheerpaneel van die domein.
  • Werwe met wye geografiese dekking benodig ongetwyfeld 'n groot aantal CDN's, maar laat ons nie fanaties wees nie. Heel waarskynlik sal die gebruiker nie 'n beduidende verskil sien in vergelyking met 'n betaalde CDN as jy bedieners op 6-7 plekke plaas nie: Europa, Noord-Amerika (oos), Noord-Amerika (wes), Singapoer, Australië, Hong Kong of Japan
  • Soms laat gashere nie die gebruik van gehuurde bedieners vir CDN-doeleindes toe nie. Daarom, as u skielik besluit om 'n inhoudafleweringsnetwerk as 'n diens te ontplooi, moenie vergeet om vooraf die reëls van 'n spesifieke gasheerverskaffer te lees nie
  • Verken onderwater kommunikasie kaartom voor te stel hoe die vastelande verbind is en dit in ag te neem wanneer 'n inhoudafleweringsnetwerk gebou word
  • Probeer om te kontroleer pings van verskillende plekke af na jou bedieners. Op hierdie manier kan u die streke naaste aan die CDN-punte sien en GeoDNS meer korrek opstel
  • Afhangende van die take, sal dit nuttig wees om Nginx te verfyn vir spesifieke kasvereistes en met inagneming van die las op die bediener. Die artikels oor Nginx-kas het my baie hierin gehelp - hier en versnelling van werk onder swaar vragte: hier и hier

Bron: will.com