CDN-ni yaratish va sozlash

Kontentni etkazib berish tarmoqlari (CDN) veb-saytlar va ilovalarda birinchi navbatda statik elementlarning yuklanishini tezlashtirish uchun ishlatiladi. Bu turli geografik hududlarda joylashgan CDN serverlarida fayllarni keshlash tufayli sodir bo'ladi. CDN orqali ma'lumotlarni so'rash orqali foydalanuvchi uni eng yaqin serverdan oladi.

Kontentni etkazib berishning barcha tarmoqlarining ishlash printsipi va funksionalligi taxminan bir xil. Faylni yuklab olish uchun so'rovni olgandan so'ng, CDN server uni bir martalik asl serverdan oladi va foydalanuvchiga beradi, shu bilan birga uni ma'lum vaqt davomida keshlaydi. Barcha keyingi so'rovlarga keshdan javob beriladi. Barcha CDN-larda fayllarni oldindan yuklash, keshni tozalash, amal qilish muddatini belgilash va boshqalar imkoniyatlari mavjud.

Shunday bo'ladiki, u yoki bu sababga ko'ra siz o'zingizning tarkibingizni etkazib berish tarmog'ingizni tashkil qilishingiz kerak, keyin esa keyingi velosipedni yig'ish bo'yicha ko'rsatmalar bizga yordam beradi.

CDN-ni yaratish va sozlash
Manba: Pikisuperstar tomonidan yaratilgan infografik vektor - www.freepik.com

Sizga shaxsiy CDN kerak bo'lganda

O'z CDN-ni ishga tushirish mantiqiy bo'lgan holatlarni ko'rib chiqing:

  • pulni tejash istagi mavjud bo'lganda va hatto arzon CDN-lardan foydalanganda ham joriy xarajatlar BunnyCDN oyiga bir necha yuz dollarni tashkil qiladi
  • agar biz server va kanal qo'shnilarisiz doimiy kesh yoki kesh olishni istasak
  • CDN xizmatlari sizga kerak bo'lgan mintaqada mavjud bo'lish nuqtalariga ega emas
  • har qanday maxsus kontentni yetkazib berish sozlamalari talab qilinadi
  • ishlab chiqarish serverini foydalanuvchilarga yaqinroq joylashtirish orqali dinamik tarkibni yetkazib berishni tezlashtirishni istaymiz
  • uchinchi tomon CDN xizmati foydalanuvchi xatti-harakatlari (salom, GDPRga mos kelmaydigan xizmatlar) haqidagi ma'lumotlarni noqonuniy ravishda to'plashi yoki ishlatishi yoki boshqa noqonuniy faoliyat bilan shug'ullanishi mumkinligidan xavotir bor

Ko'pgina boshqa hollarda, mavjud tayyor echimlardan foydalanish maqsadga muvofiqdir.

Nimadan boshlash kerak

O'zingizning avtonom tizimingiz (AS) bo'lsa, bu ajoyib. Uning yordamida siz bir xil IP-ni bir nechta serverlarga belgilashingiz mumkin va ushbu ko'rsatmaga muvofiq tarmoq darajasida foydalanuvchilarni eng yaqiniga yo'naltirish. Aytish joizki, hatto /24 manzil bloki bilan ham kontentni etkazib berish tarmog'ini yaratish mumkin. Ba'zi server provayderlari ular uchun mavjud bo'lgan barcha hududlarda foydalanish uchun e'lon qilish imkonini beradi.

Agar siz IP-manzillar blokining baxtli egasi bo'lmasangiz, oddiy CDN-ni ishga tushirish uchun sizga kerak bo'ladi:

  • domen nomi yoki subdomen
  • turli mintaqalarda kamida ikkita server. Server ajratilgan yoki virtual bo'lishi mumkin
  • geoDNS vositasi. Uning yordami bilan foydalanuvchi domenga murojaat qilib, eng yaqin serverga yo'naltiriladi

Domenni ro'yxatdan o'tkazing va serverlarga buyurtma bering

Domenni ro'yxatdan o'tkazish bilan hamma narsa oddiy - biz istalgan zonada istalgan registrator bilan ro'yxatdan o'tamiz. CDN uchun subdomendan ham foydalanishingiz mumkin, masalan, shunga o'xshash narsa cdn.domainname.com. Aslida, bizning misolimizda biz buni qilamiz.

Serverlarga buyurtma berishga kelsak, ular sizning foydalanuvchi auditoriyangiz joylashgan mintaqalar va mamlakatlarda ijaraga olinishi kerak. Agar loyiha qit'alararo bo'lsa, unda bir vaqtning o'zida butun dunyo bo'ylab serverlarni taklif qiluvchi hosting-provayderlarni tanlash qulay. Misollar: OVH, tarmoqni ijaraga olish ΠΈ 100 TB - ajratilgan serverlar uchun, Vultr ΠΈ DigitalOcean β€” virtual bulut uchun*.

Shaxsiy CDN uchun biz turli qit'alarda 3 ta virtual serverga buyurtma beramiz. Da Vultr uchun serverda $5/oy olamiz 25GB SSD joylar va 1TB trafik. O'rnatishda eng so'nggi Debian-ni tanlang. Bizning serverlarimiz:

CDN-ni yaratish va sozlash Frankfurtda, ip: 199.247.18.199

CDN-ni yaratish va sozlash Chikago, ip: 149.28.121.123

CDN-ni yaratish va sozlash Singapur, ip: 157.230.240.216

* Vultr va DigitalOcean to'lov usulini qo'shgandan so'ng darhol maqoladagi havolalar orqali ro'yxatdan o'tgan foydalanuvchilarga $100 kredit va'da qiladi. Muallif bundan kichik maqtov ham oladi, bu hozir uning uchun juda muhim. Iltimos, tushuning.

GeoDNS sozlanmoqda

Domenga yoki CDN subdomeniga kirishda foydalanuvchi kerakli (eng yaqin) serverga yo'naltirilishi uchun bizga geoDNS funksiyasiga ega DNS server kerak bo'ladi.

GeoDNS printsipi va ishlashi quyidagicha:

  1. DNS so'rovini yuborgan mijozning IP-manzilini yoki mijoz so'rovini qayta ishlashda foydalaniladigan rekursiv DNS-serverning IP-manzilini belgilaydi. Bunday rekursiv serverlar odatda provayderlarning DNS-serverlari hisoblanadi.
  2. Mijozning IP manzili uning mamlakati yoki mintaqasini taniydi. Buning uchun GeoIP ma'lumotlar bazalaridan foydalaniladi, ulardan bugungi kunda juda ko'p. Yaxshilar bor bepul variantlar.
  3. Mijozning joylashgan joyiga qarab, unga eng yaqin CDN serverining IP-manzilini beradi.

geoDNS funksiyasi bilan DNS server bo'lishi mumkin o'zingiz yig'ing, lekin butun dunyo bo'ylab DNS serverlar tarmog'i bilan tayyor echimlardan foydalanish yaxshiroqdir va Har qanday translatsiya qutidan:

  • SlouDNS ΠΎΡ‚ $9.95/oy, GeoDNS tarifi, sukut bo'yicha bitta DNS Failover mavjud
  • Zilore ΠΎΡ‚ $25/oy, DNS Failover yoqilgan
  • Amazon yo'nalishi 53 ΠΎΡ‚ $35/oy aniq 50 million geo-so'rovlar uchun. DNS uzluksizligi alohida to'lanadi
  • DNS oson ΠΎΡ‚ $125/oy, 10 ta DNS Failovers mavjud
  • CloudFlare, "Geo Rulda" funksiyasi Enterprise rejalarida mavjud

GeoDNS-ga buyurtma berishda siz tarifga kiritilgan so'rovlar soniga e'tibor qaratishingiz va domenga bo'lgan so'rovlarning haqiqiy soni kutilganidan bir necha baravar oshishi mumkinligini yodda tutishingiz kerak. Millionlab o'rgimchaklar, skanerlar, spamerlar va boshqa yovuz ruhlar tinimsiz ishlaydi.

Deyarli barcha DNS xizmatlari CDN - DNS Failover yaratish uchun ajralmas xizmatni o'z ichiga oladi. Uning yordami bilan siz serverlaringiz ishlashini monitoringini o'rnatishingiz va hayot belgilari bo'lmasa, ishlamaydigan server manzilini avtomatik ravishda DNS javoblarida zaxira nusxasi bilan almashtirishingiz mumkin.

CDN-ni yaratish uchun biz foydalanamiz CloudDNS, GeoDNS tarifi.

Domeningizni ko'rsatgan holda shaxsiy hisobingizga yangi DNS zonasini qo'shamiz. Agar biz subdomenda CDN qurayotgan bo'lsak va asosiy domen allaqachon ishlatilayotgan bo'lsa, zonani qo'shgandan so'ng darhol mavjud ishlaydigan DNS yozuvlarini qo'shishni unutmang. Keyingi qadam CDN domeni/subdomani uchun bir nechta A-yozuvlarni yaratish bo'lib, ularning har biri biz ko'rsatgan hududga qo'llaniladi. Siz qit'alar yoki mamlakatlarni mintaqa sifatida belgilashingiz mumkin, quyi mintaqalar AQSh va Kanada uchun mavjud.

Bizning holatda, CDN subdomenda ko'tariladi cdn.sayt.in. Hudud qo'shish orqali sayt.in, subdomen uchun birinchi A-rekordni yarating va butun Shimoliy Amerikani Chikagodagi serverga yo'naltiring:

CDN-ni yaratish va sozlash
Standart hududlar uchun bitta yozuv yaratishni eslab, boshqa hududlar uchun amalni takrorlaymiz. Oxirida nima bo'ladi:

CDN-ni yaratish va sozlash

Skrinshotdagi oxirgi standart yozuv barcha aniqlanmagan hududlar (va bular Yevropa, Afrika, sun'iy yo'ldosh Internet foydalanuvchilari va boshqalar) Frankfurtdagi serverga yuborilishini anglatadi.

Bu asosiy DNS sozlamalarini yakunlaydi. Domen registratorining veb-saytiga o'tish va joriy domen NS-larini ClouDNS tomonidan chiqarilganlar bilan almashtirish qoladi. Va NS yangilanganda, biz serverlarni tayyorlaymiz.

SSL sertifikatlarini o'rnatish

Bizning CDN HTTPS orqali ishlaydi, shuning uchun sizda allaqachon domen yoki subdomen uchun SSL sertifikatlari bo'lsa, ularni barcha serverlarga, masalan, katalogga yuklang. /etc/ssl/yourdomain/

Agar sertifikatlar bo'lmasa, Let's Encrypt-dan bepul olishingiz mumkin. Buning uchun mukammal ACME Shellscript. Mijozni sozlash qulay va oson, eng muhimi, u sizga ClouDNS API orqali DNS orqali domen/subdomenni tasdiqlash imkonini beradi.

Biz acme.sh-ni faqat bitta serverga o'rnatamiz - Evropa 199.247.18.199, undan sertifikatlar qolganlarga nusxalanadi. O'rnatish uchun ishga tushiring:

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

Skriptni o'rnatish jarayonida bizning ishtirokimizsiz sertifikatlarni keyingi yangilash uchun CRON ishi yaratiladi.

Sertifikat berishda domen API yordamida DNS yordamida tekshiriladi, shuning uchun Reseller API menyusidagi ClouDNS shaxsiy hisobida siz yangi foydalanuvchi API yaratishingiz va unga parol o'rnatishingiz kerak. Olingan auth-identifikator parol bilan faylga yoziladi ~/.acme.sh/dnsapi/dns_cloudns.sh (fayl bilan adashtirmaslik kerak dns_clouddns.sh). Mana izohsiz va tahrir qilinishi kerak bo'lgan qatorlar:

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<ΠΏΠ°Ρ€ΠΎΠ»ΡŒ>"

Endi biz SSL sertifikatini so'raymiz cdn.sayt.in

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

Variantlarda kelajakda sertifikatning amal qilish muddati har bir yangilangandan so'ng veb-server konfiguratsiyasini avtomatik ravishda qayta yuklash buyrug'ini belgiladik.

Sertifikatni olishning butun jarayoni 2 daqiqagacha davom etishi mumkin, uni to'xtatmang. Agar domenni tekshirishda xatolik yuzaga kelsa, buyruqni qayta ishga tushirib ko'ring. Oxirida sertifikatlar qaerga yuklanganligini ko'ramiz:

CDN-ni yaratish va sozlash

Ushbu yo'llarni unutmang, ular sertifikatni boshqa serverlarga nusxalashda, shuningdek, veb-server sozlamalarida ko'rsatilishi kerak. Biz Nginx konfiguratsiyasini qayta yuklash xatosiga e'tibor bermaymiz - sertifikatlarni yangilashda u to'liq sozlangan serverda bo'lmaydi.

SSL uchun qolganimiz faqat fayllarga yo'lni saqlab qolgan holda olingan sertifikatni ikkita boshqa serverga nusxalashdir. Keling, ularning har birida bir xil kataloglarni yaratamiz va nusxasini yaratamiz:

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/

Sertifikatlarni muntazam yangilash uchun buyruq bilan ikkala serverda kunlik CRON ishini yarating:

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

Bunday holda, masofaviy manba serveriga kirishni sozlash kerak kalit orqali, ya'ni. parolni kiritmasdan. Buni qilishni unutmang.

Nginx-ni o'rnatish va sozlash

Statik tarkibga xizmat ko'rsatish uchun biz keshlash proksi-server sifatida sozlangan Nginx-dan foydalanamiz. Paket ro'yxatlarini yangilang va uni uchta serverga o'rnating:

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

Standart o'rniga biz quyidagi spoylerdagi konfiguratsiyadan foydalanamiz:
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;
    }
  }
}

Konfiguratsiyada tahrirlang:

  • maksimal_oΚ»lcham β€” mavjud disk maydonidan oshmaydigan kesh hajmi
  • nofaol - hech kim foydalana olmaydigan keshlangan ma'lumotlarni saqlash vaqti
  • ssl_certificate ΠΈ ssl_certificate_key β€” SSL sertifikati va kalit fayllarga yo'llar
  • proksi_kesh_valid - keshlangan ma'lumotlarni saqlash vaqti
  • proxy_pass β€” CDN keshlash uchun fayllarni so'raydigan asl server manzili. Bizning misolimizda bu sayt.in

Ko'rib turganingizdek, hamma narsa oddiy. Ko'rsatmalarning o'xshashligi tufayli faqat keshlash vaqtini belgilashda qiyinchilik paydo bo'lishi mumkin nofaol ΠΈ proksi_kesh_valid. Keling, ularni misolimiz bilan tahlil qilaylik. Mana, qachon sodir bo'ladi faol emas = 7 kun ΠΈ proxy_cache_valid 90d:

  • agar so'rov 7 kun ichida takrorlanmasa, ushbu muddatdan keyin ma'lumotlar keshdan o'chiriladi
  • agar so'rov kamida 7 kunda bir marta takrorlansa, keshdagi ma'lumotlar 90 kundan keyin eskirgan deb hisoblanadi va Nginx uni asl serverdan olib, keyingi so'rov bilan yangilaydi.

Tahrirlash tugallandi nginx.conf, konfiguratsiyani qayta yuklang:

root@cdn:~# service nginx reload

Bizning CDN tayyor. $15/oy uchun. Biz uchta qit'ada mavjudlik nuqtalarini va 3 TB trafikni oldik: har bir joyda 1 TB.

CDN ishini tekshirish

Keling, turli geografik joylardan CDN-ga pinglarni ko'rib chiqaylik. Buning uchun har qanday ping xizmati ishlaydi.

Ishga tushirish nuqtasi
Xost
IP
OΚ»rtacha vaqt, ms

Germaniya Berlin
cdn.sayt.in
199.247.18.199
9.6

Gollandiya, Amsterdam
cdn.sayt.in
199.247.18.199
10.1

Frantsiya Parij
cdn.sayt.in
199.247.18.199
16.3

Buyuk Britaniya, London
cdn.sayt.in
199.247.18.199
14.9

Kanada, Toronto
cdn.sayt.in
149.28.121.123
16.2

AQSh, San-Fransisko
cdn.sayt.in
149.28.121.123
52.7

AQSh, Dallas
cdn.sayt.in
149.28.121.123
23.1

AQSh, Chikago
cdn.sayt.in
149.28.121.123
2.6

AQSh, Nyu-York
cdn.sayt.in
149.28.121.123
19.8

Singapur
cdn.sayt.in
157.230.240.216
1.7

Yaponiya Tokio
cdn.sayt.in
157.230.240.216
74.8

Avstraliya, Sidney
cdn.sayt.in
157.230.240.216
95.9

Natijalar yaxshi. Endi biz asosiy saytning ildiziga sinov tasvirini joylashtiramiz test.jpg va CDN orqali yuklab olish tezligini tekshiring. Aytishlaricha - qilingan. Kontent tezda yetkazib beriladi.

CDN nuqtasida keshni tozalamoqchi bo'lsak, kichik skript yozamiz.
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

Butun keshni o'chirish uchun uni ishga tushirish kifoya, alohida faylni quyidagicha tozalash mumkin:

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

Xulosalar o'rniga

Va nihoyat, o'sha paytda boshim og'rigan rakeni darhol bosib o'tish uchun bir nechta foydali maslahatlar bermoqchiman:

  • CDN-ning nosozliklarga chidamliligini oshirish uchun DNS Failover-ni sozlash tavsiya etiladi, bu server buzilgan taqdirda A yozuvini tezda o'zgartirishga yordam beradi. Bu domenning boshqaruv panelidagi DNS yozuvlarida amalga oshiriladi.
  • Keng geografik qamrovga ega saytlar, shubhasiz, ko'p sonli CDN-larni talab qiladi, ammo fanatik bo'lmaylik. Agar siz serverlarni 6-7 joyda: Yevropa, Shimoliy Amerika (sharq), Shimoliy Amerika (g'arbiy), Singapur, Avstraliya, Gonkong yoki Yaponiyada joylashtirsangiz, foydalanuvchi pullik CDN bilan solishtirganda sezilarli farqni sezmaydi.
  • Ba'zida xostlar CDN maqsadlarida ijaraga olingan serverlardan foydalanishga ruxsat bermaydi. Shuning uchun, agar siz to'satdan kontentni etkazib berish tarmog'ini xizmat sifatida o'rnatishga qaror qilsangiz, ma'lum bir xosting provayderining qoidalarini oldindan o'qib chiqishni unutmang.
  • Tadqiq qiling suv osti aloqa xaritasiqit'alar qanday bog'langanligini ko'rsatish va kontentni etkazib berish tarmog'ini qurishda buni hisobga olish
  • Tekshirishga harakat qiling turli joylardan pinglar serverlaringizga. Shunday qilib, siz CDN nuqtalariga eng yaqin hududlarni ko'rishingiz va GeoDNS-ni to'g'ri sozlashingiz mumkin
  • Vazifalarga qarab, Nginx-ni aniq keshlash talablari va serverdagi yukni hisobga olgan holda sozlash foydali bo'ladi. Nginx keshi haqidagi maqolalar menga bu borada ko'p yordam berdi - shu yerda va og'ir yuk ostida ishni tezlashtirish: shu yerda ΠΈ shu yerda

Manba: www.habr.com