Bati ak konfigirasyon CDN ou

Rezo livrezon kontni (CDN) yo itilize nan sit entènèt ak aplikasyon prensipalman pou pi vit chaje eleman estatik yo. Sa rive akòz kachèt dosye sou sèvè CDN ki sitiye nan diferan rejyon jewografik. Lè w mande done atravè CDN, itilizatè a resevwa li nan men sèvè ki pi pre a.

Prensip operasyon ak fonksyonalite tout rezo livrezon kontni se apeprè menm. Lè w fin resevwa yon demann pou telechaje yon fichye, sèvè CDN la pran li yon sèl-fwa nan sèvè orijinal la epi li bay itilizatè a li an menm tan an kachèt li pou yon peryòd tan espesifik. Tout demann ki vin apre yo reponn nan kachèt la. Tout CDN yo gen opsyon pou prechaje fichye yo, netwaye kachèt la, fikse dat ekspirasyon an, ak plis ankò.

Li rive ke, pou yon rezon oswa yon lòt, ou bezwen òganize pwòp rezo livrezon kontni ou a, ak Lè sa a - kite enstriksyon yo pou rasanble pwochen bisiklèt la ede nou.

Bati ak konfigirasyon CDN ou
Sous: Vektè enfografik kreye pa pikisuperstar - www.freepik.com

Lè ou bezwen pwòp CDN ou

Konsidere ka kote kouri pwòp CDN ou a fè sans:

  • lè gen yon dezi pou ekonomize lajan, ak depans kouri menm lè w ap itilize CDN ki pa chè tankou BunnyCDN montan a plizyè santèn dola pa mwa
  • si nou vle jwenn yon kachèt pèmanan oswa yon kachèt san sèvè ak vwazen chanèl
  • Sèvis CDN yo pa gen pwen prezans nan rejyon ou bezwen an
  • nenpòt anviwònman livrezon kontni espesyal ki nesesè
  • nou vle akselere livrezon kontni dinamik lè nou mete sèvè pwodiksyon an pi pre itilizatè yo
  • gen yon enkyetid ke yon twazyèm pati sèvis CDN ka ilegalman kolekte oswa itilize enfòmasyon sou konpòtman itilizatè (bonjou sèvis ki pa konfòme GDPR) oswa angaje yo nan lòt aktivite ilegal.

Nan pifò lòt ka yo, li pi apwopwiye pou itilize solisyon ki deja pare yo.

Ki sa ou bezwen kòmanse

Li bèl si ou gen pwòp sistèm otonòm ou (AS). Avèk li, ou ka bay menm IP a plizyè serveurs ak dapre enstriksyon sa a nan nivo rezo a, dirije itilizatè yo nan youn ki pi pre a. Li vo di ke menm ak blòk adrès la /24, li posib yo bati yon rezo livrezon kontni. Kèk founisè sèvè pèmèt ou fè yon anons pou itilize nan tout rejyon ki disponib pou yo.

Si ou pa yon pwopriyetè kontan nan yon blòk nan adrès IP, Lè sa a, kouri yon senp CDN w ap bezwen:

  • non domèn oswa subdomain
  • omwen de serveurs nan diferan rejyon yo. Sèvè a ka swa dedye oswa vityèl
  • zouti geoDNS. Avèk èd li, itilizatè a, li te adrese domèn nan, yo pral dirije sou sèvè ki pi pre a

Anrejistre yon domèn ak lòd serveurs

Avèk enskripsyon domèn, tout bagay se senp - nou anrejistre nan nenpòt zòn ak nenpòt ki anrejistre. Ou kapab tou itilize yon subdomain pou yon CDN, pou egzanp yon bagay tankou cdn.domainname.com. Aktyèlman, nan egzanp nou an, nou pral fè jis sa.

Kòm pou kòmande serveurs, yo ta dwe lwe nan rejyon yo ak peyi kote odyans itilizatè ou a sitiye. Si pwojè a se entèkontinantal, Lè sa a, li se pratik yo chwazi founisè hosting ki ofri serveurs nan tout mond lan nan yon fwa. Egzanp: OVH, lwaye entènèt и 100TB - pou sèvè dedye, Vultr и DigitalOcean — pou nwaj vityèl*.

Pou CDN prive nou an, nou pral kòmande 3 sèvè vityèl sou diferan kontinan. Nan Vultr sou sèvè a pou $5/mois nou pral jwenn 25GB SSD kote ak 1TB nan trafik. Lè w ap enstale, chwazi dènye Debian an. Serveurs nou yo:

Bati ak konfigirasyon CDN ou Frankfurt, IP: 199.247.18.199

Bati ak konfigirasyon CDN ou Chicago, IP: 149.28.121.123

Bati ak konfigirasyon CDN ou Singapore, IP: 157.230.240.216

* Vultr ak DigitalOcean pwomèt $100 kredi pou itilizatè ki anrejistre atravè lyen ki nan atik la imedyatman apre yo fin ajoute yon metòd peman. Otè a resevwa tou yon ti konpliman nan men sa a, ki trè enpòtan pou li kounye a. Tanpri konprann.

Mete kanpe geoDNS

Nan lòd pou itilizatè a dwe dirije sou sèvè a vle (pi pre) lè w ap jwenn aksè nan yon domèn oswa subdomain CDN, nou bezwen yon sèvè DNS ak fonksyon an geoDNS.

Prensip la ak operasyon nan geoDNS se jan sa a:

  1. Espesifye IP kliyan an ki voye demann DNS la, oswa IP sèvè DNS rekursif ki itilize lè w ap trete demann kliyan an. Sa yo sèvè repetitif yo anjeneral DNS-s nan founisè yo.
  2. IP kliyan an rekonèt peyi li oswa rejyon li. Pou sa, yo itilize baz done GeoIP, ki gen anpil jodi a. Gen bon opsyon gratis.
  3. Tou depan de kote kliyan an, ba li adrès IP sèvè CDN ki pi pre a.

Sèvè dns ak fonksyon geoDNS kapab rasanble poukont ou, men li pi bon pou itilize solisyon pare yo ak yon rezo sèvè DNS atravè mond lan ak Anycast soti nan bwat la:

  • CloudDNS soti nan $9.95/mois, tarif GeoDNS, pa default gen yon sèl DNS Failover
  • Zilore soti nan $25/mois, DNS Failover pèmèt
  • Amazon Route 53 soti nan $35/mois pou yon nèt 50M geo-demann. DNS Failover yo faktire separeman
  • DNS fè fasil soti nan $125/mois, gen 10 DNS Failovers
  • CloudFlare, Karakteristik "Geo Steering" disponib nan plan Enterprise

Lè w fè kòmande geoDNS, ou ta dwe peye atansyon sou kantite demann ki enkli nan tarif yo epi kenbe nan tèt ou ke kantite aktyèl demann nan domèn nan ka depase atant pa plizyè fwa. Dè milyon de areye, eskanè, spame ak lòt move lespri travay san pran souf.

Prèske tout sèvis DNS gen ladan yon sèvis endispansab pou bati yon CDN - DNS Failover. Avèk èd li yo, ou ka mete siveyans nan operasyon an nan serveurs ou yo epi, nan absans siy lavi, otomatikman ranplase adrès la nan yon sèvè ki pa travay ak yon sèl backup nan repons DNS.

Pou konstwi CDN nou an, nou pral itilize CloudDNS, tarif GeoDNS.

Ann ajoute yon nouvo zòn DNS nan kont pèsonèl ou, ki espesifye domèn ou. Si nou ap bati yon CDN sou yon subdomain, ak domèn prensipal la deja nan itilize, Lè sa a, imedyatman apre yo fin ajoute zòn nan, pa bliye ajoute ki deja egziste dosye DNS k ap travay. Pwochen etap la se kreye plizyè A-dosye pou domèn / subdomain CDN, chak nan yo pral aplike nan rejyon nou espesifye a. Ou ka presize kontinan oswa peyi kòm rejyon, sou-rejyon yo disponib pou USA ak Kanada.

Nan ka nou an, CDN a pral leve soti vivan sou yon subdomain cdn.sayt.in. Lè w ajoute yon zòn sayt.in, kreye premye A-dosye pou soudomèn nan epi montre tout Amerik di Nò sou sèvè a nan Chicago:

Bati ak konfigirasyon CDN ou
Ann repete aksyon an pou lòt rejyon yo, sonje kreye yon sèl antre pou rejyon default yo. Men sa k ap pase nan fen a:

Bati ak konfigirasyon CDN ou

Dènye antre default nan ekran an vle di ke tout rejyon ki pa espesifye (epi sa yo se Ewòp, Lafrik, itilizatè entènèt satelit, elatriye) yo pral voye nan sèvè a nan Frankfurt.

Sa a konplete konfigirasyon debaz DNS la. Li rete pou ale nan sit entènèt rejistrè domèn nan epi ranplase NS domèn aktyèl yo ak sa yo bay pa ClouDNS. Epi pandan ke NS yo pral mete ajou, nou pral prepare sèvè yo.

Enstalasyon sètifika SSL

CDN nou an ap travay sou HTTPS, kidonk si ou deja gen sètifika SSL pou yon domèn oswa soudomèn, telechaje yo sou tout sèvè, pou egzanp, nan anyè a. /etc/ssl/yourdomain/

Si pa gen okenn sètifika, ou ka jwenn yon sèl gratis nan Let's Encrypt. Pafè pou sa ACME Shellscript. Kliyan an se pratik ak fasil yo mete kanpe, epi sa ki pi enpòtan, li pèmèt ou valide yon domèn / subdomain pa DNS atravè API a ClouDNS.

Nou pral enstale acme.sh sou sèlman youn nan serveurs yo - Ewopeyen 199.247.18.199, ki soti nan ki sètifika yo pral kopye nan tout lòt yo. Pou enstale, kouri:

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

Pandan enstalasyon script la, yo pral kreye yon travay CRON pou plis renouvèlman sètifika san patisipasyon nou.

Lè w bay yon sètifika, yo pral tcheke domèn nan lè l sèvi avèk dns lè l sèvi avèk API a, kidonk nan kont pèsonèl ClouDNS nan meni an API Reseller, ou bezwen kreye yon nouvo API itilizatè epi mete yon modpas pou li. Yo pral ekri id otorizasyon ki lakòz ak yon modpas nan dosye a ~/.acme.sh/dnsapi/dns_cloudns.sh (pa dwe konfonn ak dosye dns_clouddns.sh). Men liy yo ki bezwen dekomantè ak modifye:

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

Koulye a, nou pral mande yon sètifika SSL pou cdn.sayt.in

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

Nan opsyon yo, pou lavni an, nou te espesifye yon lòd otomatikman rechaje konfigirasyon sèvè wèb la apre chak renouvèlman peryòd validite sètifika a nan lavni.

Tout pwosesis pou jwenn yon sètifika ka pran jiska 2 minit, pa entèwonp li. Si yon erè validation domèn rive, eseye kouri lòd la ankò. Nan fen a nou pral wè ki kote sètifika yo te telechaje:

Bati ak konfigirasyon CDN ou

Sonje chemen sa yo, yo pral bezwen espesifye lè w ap kopye sètifika a nan lòt serveurs, osi byen ke nan anviwònman yo sèvè entènèt. Nou pa peye atansyon sou erè a nan rechaje konfigirasyon Nginx - li pa pral sou yon sèvè konplètman configuré lè mete ajou sètifika yo.

Tout sa nou rete pou SSL se kopye sètifika a resevwa nan de lòt serveurs pandan w ap kenbe chemen an nan dosye yo. Ann kreye menm repèrtwar yo sou chak nan yo epi fè yon kopi:

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/

Pou mete sètifika yo mete ajou regilyèman, kreye yon travay CRON chak jou sou tou de serveurs ak kòmandman an:

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

Nan ka sa a, aksè a sèvè sous aleka dwe configuré pa kle, i.e. san yo pa antre yon modpas. Pa bliye fè li.

Enstale ak konfigirasyon Nginx

Pou sèvi kontni estatik, nou pral sèvi ak Nginx configuré kòm yon sèvè prokurasyon kachèt. Mete ajou lis pake yo epi enstale li sou tout twa serveurs:

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

Olye pou yo default la, nou itilize konfigirasyon ki soti nan spoiler ki anba a:
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;
    }
  }
}

Edit nan konfigirasyon an:

  • max_size - gwosè kachèt la, ki pa depase espas ki disponib pou disk la
  • inaktif - tan depo nan kach done ke pèsonn pa jwenn aksè
  • ssl_certificate и ssl_certificate_key — chemen pou sètifika SSL ak dosye kle yo
  • proxy_cache_valid - tan depo nan kach done yo
  • proxy_pass — adrès sèvè orijinal la kote CDN a pral mande dosye pou kachèt. Nan egzanp nou an, sa a sayt.in

Kòm ou ka wè, tout bagay se senp. Difikilte ka sèlman leve nan fikse tan an kachèt akòz resanblans nan direktiv yo inaktif и proxy_cache_valid. Ann analize yo ak egzanp nou an. Men sa ki rive lè inaktif = 7d и proxy_cache_valid 90d:

  • si demann lan pa repete nan 7 jou, Lè sa a, done yo pral efase nan kachèt la apre peryòd sa a
  • si demann lan repete omwen yon fwa chak jou 7, Lè sa a, done yo nan kachèt la pral konsidere kòm demode apre 90 jou epi Nginx pral mete ajou li ak pwochen demann lan, pran li nan sèvè orijinal la.

Fini pou edite nginx.conf, rechaje konfigirasyon an:

root@cdn:~# service nginx reload

CDN nou an pare. Pou $15/mois. nou te resevwa pwen prezans sou twa kontinan ak 3 TB trafik: 1 TB nan chak kote.

Tcheke travay CDN

Ann gade nan ping yo nan CDN nou an soti nan diferan kote jeyografik. Nenpòt sèvis ping ap travay pou sa.

Pwen lansman
Lame
IP
Tan mwayèn, ms

Almay Bèlen
cdn.sayt.in
199.247.18.199
9.6

Netherlands, Amstèdam
cdn.sayt.in
199.247.18.199
10.1

Lafrans Paris
cdn.sayt.in
199.247.18.199
16.3

Grann Bretay, Lond
cdn.sayt.in
199.247.18.199
14.9

Kanada, Toronto
cdn.sayt.in
149.28.121.123
16.2

Etazini, San Francisco
cdn.sayt.in
149.28.121.123
52.7

Etazini, Dallas
cdn.sayt.in
149.28.121.123
23.1

Etazini, 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

Japon Tokyo
cdn.sayt.in
157.230.240.216
74.8

Ostrali, Sydney
cdn.sayt.in
157.230.240.216
95.9

Rezilta yo bon. Koulye a, nou pral mete yon imaj tès nan rasin lan nan sit prensipal la tès.jpg epi tcheke vitès download li yo atravè CDN. Yo di - . Kontni yo delivre byen vit.

Ann ekri yon ti script nan ka nou vle netwaye kachèt la sou pwen CDN la.
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

Pou efase kachèt la tout antye, jis kouri li, yon dosye separe ka netwaye tankou sa a:

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

Olye pou yo konklizyon yo

Finalman, mwen vle bay kèk konsèy itil yo nan lòd yo imedyatman etap sou rato a ki te fè tèt mwen fè mal nan moman sa a:

  • Pou ogmante tolerans fòt CDN a, li rekòmande pou konfigirasyon DNS Failover, ki ede byen vit chanje dosye A nan evènman an nan yon pann sèvè. Sa a se fè nan panèl kontwòl DNS dosye yo nan domèn nan.
  • Sit ki gen pwoteksyon lajè jeyografik san dout mande pou yon gwo kantite CDN, men se pou nou pa fanatik. Gen plis chans itilizatè a pa pral remake yon diferans enpòtan konpare ak yon CDN peye si ou mete serveurs nan 6-7 kote: Ewòp, Amerik di Nò (lès), Amerik di Nò (lwès), Singapore, Ostrali, Hong Kong oswa Japon.
  • Pafwa hosters pa pèmèt itilize serveurs lwe pou rezon CDN. Se poutèt sa, si ou toudenkou deside deplwaye yon rezo livrezon kontni kòm yon sèvis, pa bliye li règ yo nan yon founisè hosting patikilye davans.
  • Eksplore kat jeyografik kominikasyon anba dlopou reprezante fason kontinan yo konekte epi pran sa an kont lè w ap bati yon rezo livrezon kontni
  • Eseye tcheke ping soti nan diferan kote sou serveurs ou yo. Nan fason sa a ou ka wè rejyon ki pi pre pwen CDN yo epi konfigirasyon GeoDNS pi kòrèkteman
  • Tou depan de travay yo, li pral itil pou ajiste Nginx pou kondisyon espesifik kachèt ak pran an kont chaj la sou sèvè a. Atik yo sou Nginx kachèt te ede m anpil nan sa a - isit la ak akselerasyon travay anba chay lou: isit la и isit la

Sous: www.habr.com