Content Delivery Networks (CDN) brukes i nettsteder og applikasjoner primært for å øke hastigheten på lasting av statiske elementer. Dette skjer på grunn av bufring av filer på CDN-servere som ligger i forskjellige geografiske regioner. Ved å be om data via CDN, mottar brukeren den fra nærmeste server.
Prinsippet for drift og funksjonalitet for alle innholdsleveringsnettverk er omtrent det samme. Etter å ha mottatt en forespørsel om å laste ned en fil, tar CDN-serveren den en gang fra den opprinnelige serveren og gir den til brukeren, samtidig som den bufres i en spesifisert tidsperiode. Alle påfølgende forespørsler besvares fra cachen. Alle CDN-er har alternativer for å forhåndslaste filer, tømme hurtigbufferen, angi utløpsdatoen og mer.
Det hender at du av en eller annen grunn må organisere ditt eget innholdsleveringsnettverk, og deretter - la instruksjonene for montering av neste sykkel være til hjelp for oss.
Tenk på tilfellene der det er fornuftig å kjøre ditt eget CDN:
når det er et ønske om å spare penger, og driftskostnader selv når du bruker rimelige CDN-er som BunnyCDN beløpe seg til flere hundre dollar i måneden
hvis vi ønsker å få en permanent cache eller en cache uten server- og kanalnaboer
CDN-tjenester har ikke tilstedeværelsespunkter i regionen du trenger
eventuelle spesielle innholdsleveringsinnstillinger som kreves
vi ønsker å fremskynde leveringen av dynamisk innhold ved å plassere produksjonsserveren nærmere brukerne
det er en bekymring for at en tredjeparts CDN-tjeneste ulovlig kan samle inn eller bruke informasjon om brukeratferd (hei ikke-GDPR-kompatible tjenester) eller delta i andre ulovlige aktiviteter
I de fleste andre tilfeller er det mer hensiktsmessig å bruke eksisterende ferdige løsninger.
Hva trenger du for å starte
Det er fantastisk hvis du har ditt eget Autonome System (AS). Med den kan du tilordne samme IP til flere servere og i henhold til denne instruksen på nettverksnivå, diriger brukerne til den nærmeste. Det er verdt å si at selv med /24-adresseblokken er det mulig å bygge et innholdsleveringsnettverk. Noen serverleverandører lar deg gjøre en kunngjøring for bruk i alle regioner som er tilgjengelige for dem.
Hvis du ikke er en lykkelig eier av en blokk med IP-adresser, trenger du for å kjøre en enkel CDN:
domenenavn eller underdomene
minst to servere i forskjellige regioner. Serveren kan enten være dedikert eller virtuell
geoDNS-verktøy. Med den vil brukeren, som har adressert domenet, bli dirigert til nærmeste server
Registrer et domene og bestill servere
Med domeneregistrering er alt enkelt - vi registrerer oss i hvilken som helst sone hos hvilken som helst registrar. Du kan også bruke et underdomene for et CDN, for eksempel noe sånt cdn.domenenavn.com. Faktisk, i vårt eksempel, vil vi gjøre nettopp det.
Når det gjelder bestillingsservere, bør de leies i regionene og landene der brukerpublikummet ditt befinner seg. Hvis prosjektet er interkontinentalt, er det praktisk å velge vertsleverandører som tilbyr servere over hele verden på en gang. Eksempler: OVH, leie web и 100Tb - for dedikerte servere, Vultr и DigitalOcean — for virtuell sky*.
For vårt private CDN vil vi bestille 3 virtuelle servere på forskjellige kontinenter. På Vultr på serveren for $5/md vi vil få 25GB SSD steder og 1 TB trafikk. Når du installerer, velg den nyeste Debian. Våre servere:
Frankfurt, IP: 199.247.18.199
Chicago, IP: 149.28.121.123
Singapore, IP: 157.230.240.216
* Vultr og DigitalOcean lover $100 kreditt til brukere som registrerer seg via lenkene i artikkelen umiddelbart etter å ha lagt til en betalingsmetode. Forfatteren får også et lite kompliment av dette, som er svært betydningsfullt for ham nå. Vær forståelsesfull.
Sette opp geoDNS
For at brukeren skal ledes til ønsket (nærmeste) server ved tilgang til et domene eller CDN-underdomene trenger vi en DNS-server med geoDNS-funksjonen.
Prinsippet og driften av geoDNS er som følger:
Spesifiserer IP-en til klienten som sendte DNS-forespørselen, eller IP-en til den rekursive DNS-serveren som brukes ved behandling av klientforespørselen. Slike rekursive servere er vanligvis DNS-er fra leverandører.
IP-en til klienten gjenkjenner hans land eller region. Til dette benyttes GeoIP-databaser, som det er svært mange av i dag. Det er gode gratis alternativer.
Avhengig av plasseringen til klienten, gir ham IP-adressen til nærmeste CDN-server.
DNS-server med geoDNS-funksjon kan være sette sammen selv, men det er bedre å bruke ferdige løsninger med et nettverk av DNS-servere rundt om i verden og anycast fra esken:
CloudDNS fra $9.95/md, GeoDNS-tariff, som standard er det én DNS-failover
CloudFlare, "Geo Steering"-funksjonen er tilgjengelig i Enterprise-planer
Når du bestiller geoDNS, bør du være oppmerksom på antall forespørsler som er inkludert i tariffen og huske på at det faktiske antallet forespørsler til domenet kan overgå forventningene flere ganger. Millioner av edderkopper, skannere, spammere og andre onde ånder jobber utrettelig.
Nesten alle DNS-tjenester inkluderer en uunnværlig tjeneste for å bygge en CDN - DNS Failover. Med dens hjelp kan du sette opp overvåking av driften av serverne dine og, i fravær av tegn på liv, automatisk erstatte adressen til en ikke-fungerende server med en sikkerhetskopi i DNS-svar.
For å bygge vårt CDN, vil vi bruke CloudDNS, GeoDNS-tariff.
La oss legge til en ny DNS-sone i din personlige konto, og spesifisere domenet ditt. Hvis vi bygger et CDN på et underdomene, og hoveddomenet allerede er i bruk, så umiddelbart etter å ha lagt til sonen, ikke glem å legge til de eksisterende fungerende DNS-postene. Det neste trinnet er å lage flere A-poster for CDN-domenet / underdomenet, som hver vil bli brukt til regionen vi spesifiserte. Du kan spesifisere kontinenter eller land som regioner, underregioner er tilgjengelige for USA og Canada.
I vårt tilfelle vil CDN bli hevet på et underdomene cdn.sayt.in. Ved å legge til en sone sayt.in, opprett den første A-posten for underdomenet og pek hele Nord-Amerika til serveren i Chicago:
La oss gjenta handlingen for andre regioner, og husk å opprette én oppføring for standardregionene. Her er hva som skjer til slutt:
Den siste standardoppføringen i skjermbildet betyr at alle uspesifiserte regioner (og disse er Europa, Afrika, satellittinternettbrukere osv.) vil bli sendt til serveren i Frankfurt.
Dette fullfører det grunnleggende DNS-oppsettet. Det gjenstår å gå til domeneregistratorens nettsted og erstatte de nåværende domene-NS-ene med de som er utstedt av ClouDNS. Og mens NS-ene vil bli oppdatert, vil vi klargjøre serverne.
Installasjon av SSL-sertifikater
Vårt CDN vil fungere over HTTPS, så hvis du allerede har SSL-sertifikater for et domene eller underdomene, last dem opp til alle servere, for eksempel til katalogen /etc/ssl/dittdomene/
Hvis det ikke er noen sertifikater, kan du få et gratis fra Let's Encrypt. Perfekt for dette ACME Shellscript. Klienten er praktisk og enkel å sette opp, og viktigst av alt, den lar deg validere et domene/underdomene med DNS via ClouDNS API.
Vi vil installere acme.sh på bare én av serverne - European 199.247.18.199, hvorfra sertifikater vil bli kopiert til alle de andre. For å installere, kjør:
Under installasjonen av scriptet vil det bli opprettet en CRON-jobb for ytterligere fornyelse av sertifikater uten vår deltagelse.
Når du utsteder et sertifikat, vil domenet bli kontrollert ved hjelp av DNS ved hjelp av API, så i den personlige ClouDNS-kontoen i Reseller API-menyen må du opprette en ny bruker-API og angi et passord for den. Den resulterende auth-ID-en med et passord vil bli skrevet i filen ~/.acme.sh/dnsapi/dns_cloudns.sh (ikke å forveksle med fil dns_clouddns.sh). Her er linjene som må ikke kommenteres og redigeres:
I alternativene, for fremtiden, har vi spesifisert en kommando for automatisk å laste nettserverkonfigurasjonen på nytt etter hver fornyelse av sertifikatets gyldighetsperiode i fremtiden.
Hele prosessen med å få et sertifikat kan ta opptil 2 minutter, ikke avbryt den. Hvis det oppstår en domenevalideringsfeil, prøv å kjøre kommandoen på nytt. På slutten vil vi se hvor sertifikatene er lastet opp:
Husk disse banene, de må spesifiseres når du kopierer sertifikatet til andre servere, samt i webserverinnstillingene. Vi tar ikke hensyn til feilen med å laste inn Nginx-konfigurasjoner på nytt - den vil ikke være på en fullt konfigurert server når du oppdaterer sertifikater.
Alt vi har igjen for SSL er å kopiere det mottatte sertifikatet til to andre servere mens vi opprettholder banen til filene. La oss lage de samme katalogene på hver av dem og lage en kopi:
maks_størrelse — størrelsen på hurtigbufferen, som ikke overskrider tilgjengelig diskplass
inaktiv - Lagringstid for hurtigbufrede data som ingen fikk tilgang til
ssl_certificate и ssl_certificate_key — stier til SSL-sertifikat og nøkkelfiler
proxy_cache_valid - lagringstid for hurtigbufrede data
proxy_pass — Adressen til den opprinnelige serveren som CDN vil be om filer for caching fra. I vårt eksempel, dette sayt.in
Som du kan se, er alt enkelt. Det kan bare oppstå vanskeligheter med å stille inn hurtigbuffertiden på grunn av likheten mellom direktivene inaktiv и proxy_cache_valid. La oss analysere dem med vårt eksempel. Her er hva som skjer når inaktiv=7d и proxy_cache_valid 90d:
hvis forespørselen ikke gjentas innen 7 dager, vil dataene bli slettet fra cachen etter denne perioden
hvis forespørselen gjentas minst en gang hver 7. dag, vil dataene i hurtigbufferen bli ansett som foreldet etter 90 dager, og Nginx vil oppdatere den med neste forespørsel, og ta den fra den opprinnelige serveren
Ferdig med å redigere nginx.conf, last inn konfigurasjonen på nytt:
root@cdn:~# service nginx reload
Vår CDN er klar. For $15/md. vi mottok tilstedeværelsespunkter på tre kontinenter og 3 TB trafikk: 1 TB på hvert sted.
Sjekker arbeidet til CDN
La oss se på pingene til vårt CDN fra forskjellige geografiske steder. Enhver ping-tjeneste vil fungere for dette.
Storbritannia, London
cdn.sayt.in
199.247.18.199
14.9
Canada, 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
Resultatene er gode. Nå skal vi plassere et testbilde i roten av hovedsiden test.jpg og sjekk nedlastingshastigheten via CDN. Det er sagt - laget. Innhold leveres raskt.
La oss skrive et lite skript i tilfelle vi ønsker å tømme hurtigbufferen på CDN-punktet. 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
For å slette hele cachen, bare kjør den, en separat fil kan renses slik:
root@cdn:~# ./purge.sh /test.jpg
I stedet for konklusjoner
Til slutt vil jeg gi noen nyttige tips for umiddelbart å tråkke over raken som gjorde vondt i hodet på den tiden:
For å øke feiltoleransen til CDN, anbefales det å konfigurere DNS Failover, som hjelper til med å raskt endre A-posten i tilfelle serverbrudd. Dette gjøres i kontrollpanelets DNS-poster for domenet.
Nettsteder med bred geografisk dekning krever uten tvil et stort antall CDN-er, men la oss ikke være fanatiske. Mest sannsynlig vil brukeren ikke merke noen signifikant forskjell sammenlignet med et betalt CDN hvis du plasserer servere på 6-7 steder: Europa, Nord-Amerika (øst), Nord-Amerika (vest), Singapore, Australia, Hong Kong eller Japan
Noen ganger tillater ikke hostere bruk av leide servere for CDN-formål. Derfor, hvis du plutselig bestemmer deg for å distribuere et innholdsleveringsnettverk som en tjeneste, ikke glem å lese reglene til en bestemt vertsleverandør på forhånd
Utforske undervannskart for kommunikasjonå representere hvordan kontinentene henger sammen og ta hensyn til dette når du bygger et innholdsleveringsnettverk
Prøv å sjekke pinger fra forskjellige steder til serverne dine. På denne måten kan du se regionene nærmest CDN-punktene og konfigurere GeoDNS mer korrekt
Avhengig av oppgavene vil det være nyttig å finjustere Nginx for spesifikke bufringskrav og ta hensyn til belastningen på serveren. Artiklene om Nginx cache hjalp meg mye med dette - her og akselerasjon av arbeid under tung belastning: her и her