CDN құру және конфигурациялау

Content Delivery Networks (CDNs) веб-сайттар мен қолданбаларда негізінен статикалық элементтерді жүктеуді жылдамдату үшін қолданылады. Бұл әртүрлі географиялық аймақтарда орналасқан CDN серверлеріндегі файлдарды кэштеумен байланысты болады. CDN арқылы деректерді сұрау арқылы пайдаланушы оны ең жақын серверден алады.

Барлық мазмұнды жеткізу желілерінің жұмыс істеу принципі мен функционалдығы шамамен бірдей. Файлды жүктеп алуға сұранысты алған CDN сервері оны бастапқы серверден бір рет алып, пайдаланушыға береді, сонымен бірге белгілі бір уақыт аралығында кэштейді. Барлық кейінгі сұрауларға кэштен жауап беріледі. Барлық CDN-де файлдарды алдын ала жүктеу, кэшті тазалау, жарамдылық мерзімін орнату және т.б. опциялары бар.

Қандай да бір себептермен сіз өзіңіздің мазмұнды жеткізу желісін ұйымдастыруыңыз керек, содан кейін келесі велосипедті құрастыру нұсқаулары бізге көмектессін.

CDN құру және конфигурациялау
Ақпарат көзі: Pikisuperstar жасаған инфографикалық вектор - www.freepik.com

Сізге жеке CDN қажет болғанда

Жеке CDN іске қосу мағынасы бар жағдайларды қарастырыңыз:

  • сияқты қымбат емес CDN-лерді пайдаланған кезде де ақшаны үнемдеуге және ағымдағы шығындарға деген ұмтылыс болған кезде BunnyCDN айына бірнеше жүз долларды құрайды
  • егер біз тұрақты кэшті немесе сервер мен арна көршілері жоқ кэшті алғымыз келсе
  • CDN қызметтерінің сізге қажет аймақта қатысу нүктелері жоқ
  • кез келген арнайы мазмұнды жеткізу параметрлері қажет
  • біз өндірістік серверді пайдаланушыларға жақын орналастыру арқылы динамикалық мазмұнды жеткізуді тездеткіміз келеді
  • үшінші тараптың CDN қызметі пайдаланушы әрекеті туралы ақпаратты заңсыз жинауы немесе пайдалануы мүмкін (GDPR сәйкес келмейтін қызметтер) немесе басқа заңсыз әрекеттермен айналысуы мүмкін деген алаңдаушылық бар.

Көптеген басқа жағдайларда, бұрыннан бар дайын шешімдерді қолданған дұрыс.

Сізге неден бастау керек

Егер сізде өзіңіздің Автономды Жүйеңіз (AS) болса, бұл керемет. Оның көмегімен сіз бірнеше серверлерге бірдей IP тағайындай аласыз және осы нұсқаулыққа сәйкес желі деңгейінде пайдаланушыларды ең жақынға бағыттаңыз. Айта кету керек, /24 мекенжай блогымен де мазмұнды жеткізу желісін құруға болады. Кейбір сервер провайдерлері өздеріне қолжетімді барлық аймақтарда пайдалану үшін хабарландыру жасауға мүмкіндік береді.

Егер сіз IP мекенжайлар блогының бақытты иесі болмасаңыз, қарапайым CDN іске қосу үшін сізге қажет:

  • домен атауы немесе қосалқы домен
  • әртүрлі аймақтардағы кемінде екі сервер. Сервер арнайы немесе виртуалды болуы мүмкін
  • geoDNS құралы. Оның көмегімен пайдаланушы доменге хабарласып, ең жақын серверге бағытталады

Доменді тіркеңіз және серверлерге тапсырыс беріңіз

Доменді тіркеу кезінде бәрі қарапайым - біз кез келген аймақта кез келген тіркеушімен тіркелеміз. Сондай-ақ CDN үшін қосалқы доменді пайдалануға болады, мысалы, бір нәрсе cdn.domainname.com. Шын мәнінде, біздің мысалда біз дәл осылай жасаймыз.

Серверлерге тапсырыс беруге келетін болсақ, олар сіздің пайдаланушы аудиторияңыз орналасқан аймақтар мен елдерде жалға алынуы керек. Егер жоба континентаралық болса, онда бүкіл әлем бойынша серверлерді ұсынатын хостинг провайдерлерін бірден таңдау ыңғайлы. Мысалдар: Ovh, Жалға алу и 100Тб - арнайы серверлер үшін, Vultr и DigitalOcean — виртуалды бұлт үшін*.

Жеке CDN үшін біз әртүрлі континенттерде 3 виртуалды серверге тапсырыс береміз. Сағат Vultr үшін серверде $5/ай аламыз 25GB SSD орындар және 1 ТБ трафик. Орнатқан кезде соңғы Debian нұсқасын таңдаңыз. Біздің серверлер:

CDN құру және конфигурациялау Франкфурт, ip: 199.247.18.199

CDN құру және конфигурациялау Чикаго, ip: 149.28.121.123

CDN құру және конфигурациялау Сингапур, ip: 157.230.240.216

* Vultr және DigitalOcean төлем әдісін қосқаннан кейін бірден мақаладағы сілтемелер арқылы тіркелген пайдаланушыларға $100 несие береді. Автор да осыдан шағын комплимент алады, бұл қазір ол үшін өте маңызды. Түсіністікпен қарауыңызды өтінемін.

GeoDNS орнату

Доменге немесе CDN қосалқы доменіне кіру кезінде пайдаланушы қажетті (ең жақын) серверге бағытталуы үшін бізге geoDNS функциясы бар DNS сервері қажет.

GeoDNS принципі мен жұмысы келесідей:

  1. DNS сұрауын жіберген клиенттің IP мекенжайын немесе клиенттік сұрауды өңдеу кезінде пайдаланылатын рекурсивті DNS серверінің IP мекенжайын көрсетеді. Мұндай рекурсивті серверлер әдетте провайдерлердің DNS-тері болып табылады.
  2. Клиенттің IP мекенжайы оның елін немесе аймағын таниды. Ол үшін GeoIP дерекқорлары пайдаланылады, олардың бүгінгі күні өте көп. Жақсылар бар тегін опциялар.
  3. Клиенттің орналасқан жеріне байланысты оған ең жақын CDN серверінің IP мекенжайын береді.

geoDNS функциясы бар DNS сервері болуы мүмкін өзіңіз жинаңыз, бірақ бүкіл әлем бойынша DNS серверлер желісімен дайын шешімдерді пайдалану жақсы және Кез келген қораптан:

  • CloudDNS от $9.95/ай, GeoDNS тарифі, әдепкі бойынша бір DNS Failover бар
  • Зилор от $25/ай, DNS ақаулығы қосылған
  • Amazon бағыты 53 от $35/ай таза 50 миллион геосұраныс үшін. DNS ақаулығы бөлек төленеді
  • DNS оңай от $125/ай, 10 DNS орындалмауы бар
  • CloudFlare, "Geo Steering" мүмкіндігі Enterprise жоспарларында қолжетімді

GeoDNS-ке тапсырыс беру кезінде сіз тарифке енгізілген сұраныстардың санына назар аударуыңыз керек және доменге сұраныстардың нақты саны күткеннен бірнеше есе асып кетуі мүмкін екенін есте сақтаңыз. Миллиондаған өрмекшілер, сканерлер, спамерлер және басқа зұлым рухтар тынымсыз жұмыс істейді.

Барлық дерлік DNS қызметтері CDN құру үшін таптырмас қызметті қамтиды - DNS Failover. Оның көмегімен сіз өзіңіздің серверлеріңіздің жұмысын бақылауды орната аласыз және өмірлік белгілер болмаған жағдайда DNS жауаптарында жұмыс істемейтін сервердің мекенжайын сақтық көшірмемен автоматты түрде ауыстыра аласыз.

CDN құру үшін біз пайдаланамыз CloudDNS, GeoDNS тарифі.

Доменіңізді көрсете отырып, жеке тіркелгіңізге жаңа DNS аймағын қосамыз. Егер біз қосалқы доменде CDN құрып жатсақ және негізгі домен қазірдің өзінде қолданыста болса, аймақты қосқаннан кейін бірден бар жұмыс істейтін DNS жазбаларын қосуды ұмытпаңыз. Келесі қадам CDN домені/қосалқы домені үшін бірнеше A-жазбаларын жасау болып табылады, олардың әрқайсысы біз көрсеткен аймаққа қолданылады. Құрлықтарды немесе елдерді аймақтар ретінде көрсетуге болады, қосалқы аймақтар АҚШ пен Канада үшін қолжетімді.

Біздің жағдайда CDN қосалқы доменде көтеріледі cdn.sayt.in. Аймақ қосу арқылы sayt.in, қосалқы домен үшін бірінші A жазбасын жасаңыз және бүкіл Солтүстік Американы Чикагодағы серверге бағыттаңыз:

CDN құру және конфигурациялау
Әдепкі аймақтар үшін бір жазба жасауды есте сақтай отырып, әрекетті басқа аймақтар үшін қайталайық. Міне, соңында не болады:

CDN құру және конфигурациялау

Скриншоттағы соңғы әдепкі жазба барлық анықталмаған аймақтардың (және бұл Еуропа, Африка, спутниктік интернет пайдаланушылары және т.б.) Франкфурттағы серверге жіберілетінін білдіреді.

Бұл негізгі DNS орнатуды аяқтайды. Домен тіркеушісінің веб-сайтына өтіп, ағымдағы NS домендерін ClouDNS шығарғандармен ауыстыру қалады. Ал NS жаңартылған кезде біз серверлерді дайындаймыз.

SSL сертификаттарын орнату

Біздің CDN HTTPS арқылы жұмыс істейді, сондықтан сізде домен немесе қосалқы домен үшін SSL сертификаттары бар болса, оларды барлық серверлерге, мысалы, каталогқа жүктеңіз. /etc/ssl/yourdomain/

Егер сертификаттар болмаса, Let's Encrypt қолданбасынан тегін сертификат алуға болады. Бұл үшін тамаша ACME Shellscript. Клиент ыңғайлы және орнату оңай, ең бастысы, ол ClouDNS API арқылы DNS арқылы доменді/қосалқы доменді тексеруге мүмкіндік береді.

Біз acme.sh серверін тек бір серверге орнатамыз - Еуропалық 199.247.18.199, оның сертификаттары қалғандарының барлығына көшіріледі. Орнату үшін іске қосыңыз:

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

Сценарийді орнату кезінде біздің қатысуымызсыз сертификаттарды одан әрі жаңарту үшін CRON жұмысы жасалады.

Сертификат беру кезінде домен API арқылы DNS арқылы тексеріледі, сондықтан Reseller API мәзіріндегі ClouDNS жеке тіркелгісінде жаңа пайдаланушы API құру және оған құпия сөз орнату қажет. Құпия сөзбен алынған аутентификация идентификаторы файлға жазылады ~/.acme.sh/dnsapi/dns_cloudns.sh (файлмен шатастырмау керек dns_clouddns.sh). Міне, түсініктемесіз және өңделетін жолдар:

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

Енді біз SSL сертификатын сұраймыз cdn.sayt.in

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

Опцияларда болашақта біз болашақта сертификаттың жарамдылық мерзімін әр ұзартқаннан кейін веб-сервер конфигурациясын автоматты түрде қайта жүктеу пәрменін көрсеттік.

Сертификат алудың бүкіл процесі 2 минутқа дейін созылуы мүмкін, оны үзбеңіз. Доменді тексеру қатесі орын алса, пәрменді қайта іске қосып көріңіз. Соңында біз сертификаттардың қай жерде жүктелгенін көреміз:

CDN құру және конфигурациялау

Бұл жолдарды есте сақтаңыз, олар сертификатты басқа серверлерге көшіру кезінде, сондай-ақ веб-сервер параметрлерінде көрсетілуі керек. Біз Nginx конфигурацияларын қайта жүктеу қатесіне назар аудармаймыз - ол сертификаттарды жаңарту кезінде толық конфигурацияланған серверде болмайды.

Бізде SSL үшін қалғаны - файлдарға жолды сақтай отырып, алынған сертификатты басқа екі серверге көшіру. Олардың әрқайсысында бірдей каталогтарды жасап, көшірмесін жасайық:

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/

Сертификаттарды жүйелі түрде жаңарту үшін екі серверде де пәрменмен күнделікті CRON жұмысын жасаңыз:

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

Бұл жағдайда қашықтағы бастапқы серверге кіру конфигурациялануы керек кілт арқылы, яғни. құпия сөзді енгізбей. Мұны істеуді ұмытпаңыз.

Nginx орнату және конфигурациялау

Статикалық мазмұнға қызмет көрсету үшін кэштеу прокси сервері ретінде конфигурацияланған Nginx пайдаланамыз. Пакет тізімдерін жаңартыңыз және оны барлық үш серверге орнатыңыз:

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

Әдепкі мәннің орнына біз төмендегі спойлерден конфигурацияны қолданамыз:
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;
    }
  }
}

Конфигурацияда өңдеу:

  • максималды_өлшем — дискідегі бос орыннан аспайтын кэш өлшемі
  • белсенді емес - ешкім қол жеткізе алмайтын кэштелген деректерді сақтау уақыты
  • ssl_certificate и ssl_certificate_key — SSL сертификатына және негізгі файлдарға жолдар
  • прокси_кэш_жарамды - кэштелген мәліметтерді сақтау уақыты
  • proxy_pass — CDN кэштеу үшін файлдарды сұрайтын түпнұсқа сервердің мекенжайы. Біздің мысалда бұл sayt.in

Көріп отырғаныңыздай, бәрі қарапайым. Директивалар ұқсастығына байланысты кэштеу уақытын орнатуда қиындықтар туындауы мүмкін белсенді емес и прокси_кэш_жарамды. Оларды мысалмен талдап көрейік. Міне, қашан болады белсенді емес=7күн и proxy_cache_valid 90күн:

  • егер сұрау 7 күн ішінде қайталанбаса, онда деректер осы кезеңнен кейін кэштен жойылады
  • егер сұрау кем дегенде 7 күнде бір рет қайталанса, кэштегі деректер 90 күннен кейін ескірген болып саналады және Nginx оны бастапқы серверден алып, келесі сұраумен жаңартады.

Өңдеу аяқталды nginx.conf, конфигурацияны қайта жүктеңіз:

root@cdn:~# service nginx reload

Біздің CDN дайын. Айына $15. Біз үш континентте болу нүктелерін және 3 ТБ трафикті алдық: әр жерде 1 ТБ.

CDN жұмысын тексеру

Әр түрлі географиялық орындардан CDN-ге арналған пингтерді қарастырайық. Бұл үшін кез келген пинг қызметі жұмыс істейді.

Іске қосу нүктесі
Хост
IP
Орташа уақыт, мс

Германия Берлин
cdn.sayt.in
199.247.18.199
9.6

Нидерланды, Амстердам
cdn.sayt.in
199.247.18.199
10.1

Франция Париж
cdn.sayt.in
199.247.18.199
16.3

Ұлыбритания, Лондон
cdn.sayt.in
199.247.18.199
14.9

Канада, Торонто
cdn.sayt.in
149.28.121.123
16.2

АҚШ, Сан-Франциско
cdn.sayt.in
149.28.121.123
52.7

АҚШ, Даллас
cdn.sayt.in
149.28.121.123
23.1

АҚШ, Чикаго
cdn.sayt.in
149.28.121.123
2.6

АҚШ, Нью -Йорк
cdn.sayt.in
149.28.121.123
19.8

Сингапур
cdn.sayt.in
157.230.240.216
1.7

Жапония Токио
cdn.sayt.in
157.230.240.216
74.8

Австралия, Сидней
cdn.sayt.in
157.230.240.216
95.9

Нәтижелері жақсы. Енді біз негізгі сайттың түбірінде сынақ кескінін орналастырамыз test.jpg және оның жүктеу жылдамдығын CDN арқылы тексеріңіз. Айтылады - жасалған. Мазмұн тез жеткізіледі.

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

Бүкіл кэшті жою үшін оны іске қосыңыз, бөлек файлды келесідей тазалауға болады:

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

Қорытындылар орнына

Соңында, сол кезде басымды ауыртқан тырманың үстінен бірден өту үшін пайдалы кеңестер бергім келеді:

  • CDN қатеге төзімділігін арттыру үшін сервер істен шыққан жағдайда A жазбасын жылдам өзгертуге көмектесетін DNS Failover конфигурациялау ұсынылады. Бұл доменнің DNS жазбаларының басқару тақтасында орындалады.
  • Кең географиялық қамтуы бар сайттар CDN-дің көп санын қажет ететіні сөзсіз, бірақ фанатик болмайық. Серверлерді 6-7 орынға орналастырсаңыз, пайдаланушы ақылы CDN-мен салыстырғанда айтарлықтай айырмашылықты байқамауы мүмкін: Еуропа, Солтүстік Америка (шығыс), Солтүстік Америка (батыс), Сингапур, Австралия, Гонконг немесе Жапония
  • Кейде хостерлер жалға алынған серверлерді CDN мақсаттары үшін пайдалануға рұқсат бермейді. Сондықтан, егер сіз кенеттен мазмұнды жеткізу желісін қызмет ретінде орналастыруды шешсеңіз, белгілі бір хостинг провайдерінің ережелерін алдын ала оқып шығуды ұмытпаңыз.
  • Зерттеу су астындағы коммуникациялар картасыконтиненттердің қалай қосылғанын көрсету және мазмұнды жеткізу желісін құру кезінде осыны ескеру
  • Тексеріп көріңіз әртүрлі жерлерден пингтер серверлеріңізге. Осылайша сіз CDN нүктелеріне ең жақын аймақтарды көре аласыз және GeoDNS-ті дұрыс конфигурациялай аласыз
  • Тапсырмаларға байланысты нақты кэштеу талаптарына және сервердегі жүктемені ескере отырып, Nginx-ті дәл баптау пайдалы болады. Nginx кэші туралы мақалалар маған бұл жерде көп көмектесті - осында және ауыр жүктемелердегі жұмысты жеделдету: осында и осында

Ақпарат көзі: www.habr.com