CDN-ээ үүсгэж, тохируулж байна

Агуулга хүргэх сүлжээ (CDNs) нь үндсэндээ статик элементүүдийн ачааллыг хурдасгахын тулд вэб сайт болон програмуудад ашиглагддаг. Энэ нь газарзүйн өөр өөр бүс нутагт байрлах CDN серверүүд дээрх файлуудыг кэш хийсэнтэй холбоотой юм. CDN-ээр дамжуулан өгөгдөл хүссэнээр хэрэглэгч үүнийг хамгийн ойрын серверээс хүлээн авдаг.

Агуулга хүргэх бүх сүлжээнүүдийн үйл ажиллагааны зарчим, үйл ажиллагааны зарчим нь ойролцоогоор ижил байдаг. Файлыг татаж авах хүсэлтийг хүлээн авсны дараа CDN сервер нь үүнийг анхны серверээс нэг удаа авч, хэрэглэгчдэд өгөхийн зэрэгцээ тодорхой хугацааны турш кэш хийдэг. Дараачийн бүх хүсэлтүүдэд кэшээс хариу өгдөг. Бүх CDN-д файлуудыг урьдчилан ачаалах, кэшийг цэвэрлэх, дуусах хугацааг тохируулах гэх мэт сонголтууд байдаг.

Нэг шалтгааны улмаас та өөрийн контент хүргэх сүлжээг зохион байгуулах хэрэгтэй болж, дараа нь дараагийн дугуйг угсрах заавар бидэнд тустай байх болно.

CDN-ээ үүсгэж, тохируулж байна
Эх сурвалж: Pikisuperstar-ийн бүтээсэн инфографик вектор - www.freepik.com

Танд өөрийн CDN хэрэгтэй үед

Өөрийн CDN ажиллуулах нь утга учиртай тохиолдлуудыг авч үзье.

  • гэх мэт хямд CDN ашиглаж байсан ч мөнгө хэмнэх хүсэл, урсгал зардал гарах үед BunnyCDN сард хэдэн зуун доллар хүрдэг
  • хэрэв бид байнгын кэш эсвэл сервер болон сувгийн хөршгүй кэш авахыг хүсвэл
  • CDN үйлчилгээнд танд хэрэгтэй бүс нутагт байрлах цэг байхгүй
  • шаардлагатай аливаа тусгай контент дамжуулах тохиргоо
  • Бид үйлдвэрлэлийн серверийг хэрэглэгчдэд ойртуулах замаар динамик контентын хүргэлтийг хурдасгахыг хүсч байна
  • Гуравдагч этгээдийн CDN үйлчилгээ нь хэрэглэгчийн зан байдлын талаарх мэдээллийг хууль бусаар цуглуулах, ашиглах (GDPR-д нийцэхгүй үйлчилгээ) эсвэл бусад хууль бус үйл ажиллагаа явуулж болзошгүй гэсэн болгоомжлол байдаг.

Бусад ихэнх тохиолдолд одоо байгаа бэлэн шийдлүүдийг ашиглах нь илүү тохиромжтой.

Юу эхлэх хэрэгтэй байна

Хэрэв та өөрийн бие даасан системтэй бол үнэхээр гайхалтай. Үүний тусламжтайгаар та ижил IP-г хэд хэдэн серверт оноож болно энэ зааврын дагуу сүлжээний түвшинд хэрэглэгчдийг хамгийн ойрын нэг рүү чиглүүлэх. /24 хаягийн блоктой ч гэсэн контент хүргэх сүлжээг бий болгох боломжтой гэдгийг хэлэх нь зүйтэй болов уу. Зарим сервер үйлчилгээ үзүүлэгч нь танд боломжтой бүх бүс нутагт ашиглах зарлал гаргах боломжийг олгодог.

Хэрэв та IP хаягийн блокийн аз жаргалтай эзэн биш бол энгийн CDN ажиллуулахын тулд танд дараахь зүйл хэрэгтэй болно.

  • домэйн нэр эсвэл дэд домайн
  • өөр өөр бүс нутагт дор хаяж хоёр сервер. Сервер нь зориулалтын болон виртуал байж болно
  • geoDNS хэрэгсэл. Үүний тусламжтайгаар хэрэглэгч домэйнд хандсанаар хамгийн ойрын сервер рүү чиглүүлэх болно

Домэйн бүртгүүлж, сервер захиалаарай

Домэйн бүртгэлийн хувьд бүх зүйл энгийн байдаг - бид ямар ч бүртгэгчтэй аль ч бүсэд бүртгүүлдэг. Та мөн CDN-д дэд домайн ашиглаж болно, жишээлбэл, жишээлбэл cdn.domainname.com. Үнэндээ бидний жишээн дээр бид үүнийг л хийх болно.

Сервер захиалахын тулд тэдгээрийг таны хэрэглэгчдийн үзэгчид байрладаг бүс нутаг, улс орнуудад түрээслэх ёстой. Хэрэв төсөл нь тив хоорондынх бол дэлхийн өнцөг булан бүрт сервер санал болгодог хостинг үйлчилгээ үзүүлэгчдийг сонгоход тохиромжтой. Жишээ нь: OVH, Түрээсийн вэб и 100Тб - зориулалтын серверүүдийн хувьд, Вулр и ДижиталОcean — виртуал үүлэнд*.

Манай хувийн CDN-ийн хувьд бид өөр өөр тивд 3 виртуал сервер захиалах болно. At Вулр сервер дээр Сард 5 доллар бид авах болно 25GB SSD газрууд болон 1TB урсгал. Суулгахдаа хамгийн сүүлийн үеийн 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 Failover идэвхжсэн
  • Амазоны зам 53 нь Сард 35 доллар цэвэр 50 сая гео-хүсэлтийн хувьд. DNS Failover төлбөрийг тусад нь төлдөг
  • DNS-ийг хялбар болгосон нь Сард 125 доллар, 10 DNS Failovers байдаг
  • Cloudflare, "Гео удирдах" функцийг Enterprise төлөвлөгөөнд ашиглах боломжтой

GeoDNS захиалахдаа та тарифт багтсан хүсэлтийн тоонд анхаарлаа хандуулж, домайн руу илгээсэн хүсэлтийн бодит тоо хүлээлтээс хэд дахин давж болно гэдгийг санаарай. Сая сая аалз, сканнер, спам илгээгч болон бусад муу ёрын сүнснүүд уйгагүй ажилладаг.

Бараг бүх DNS үйлчилгээнүүд нь CDN - DNS Failover-ийг бүтээхэд зайлшгүй шаардлагатай үйлчилгээг агуулдаг. Үүний тусламжтайгаар та серверийнхээ ажиллагааг хянах боломжтой бөгөөд амьдралын шинж тэмдэг илрээгүй тохиолдолд ажиллахгүй байгаа серверийн хаягийг DNS хариултын нөөц хаягаар автоматаар сольж болно.

CDN-ээ бүтээхийн тулд бид ашиглах болно CloudDNS, GeoDNS тариф.

Таны хувийн дансанд шинэ DNS бүсийг нэмж, домайнаа зааж өгье. Хэрэв бид дэд домайн дээр CDN барьж байгаа бөгөөд үндсэн домэйн аль хэдийн ашиглагдаж байгаа бол бүсийг нэмсний дараа одоо байгаа ажиллаж байгаа DNS бичлэгүүдийг нэмэхээ бүү мартаарай. Дараагийн алхам бол CDN домэйн / дэд домэйны хэд хэдэн A бичлэг үүсгэх бөгөөд тэдгээр нь тус бүрийг бидний тодорхойлсон бүс нутагт ашиглах болно. Та тив, улсуудыг бүс болгон зааж өгч болно, дэд бүсүүдийг АНУ, Канад улсад ашиглах боломжтой.

Манай тохиолдолд CDN нь дэд домайн дээр нэмэгдэнэ cdn.sayt.in. Бүс нэмэх замаар sayt.in, дэд домэйны анхны А бичлэгийг үүсгэж, бүх Хойд Америкийг Чикаго дахь сервер рүү чиглүүлээрэй:

CDN-ээ үүсгэж, тохируулж байна
Өгөгдмөл бүсүүдэд нэг оруулга үүсгэхээ санаж, бусад бүс нутагт үйлдлийг давтан хийцгээе. Эцэст нь юу болохыг энд харуулав.

CDN-ээ үүсгэж, тохируулж байна

Дэлгэцийн агшин дахь хамгийн сүүлийн үндсэн оруулга нь тодорхойгүй бүх бүс нутгийг (мөн эдгээр нь Европ, Африк, хиймэл дагуулын интернет хэрэглэгчид гэх мэт) Франкфурт дахь сервер рүү илгээнэ гэсэн үг юм.

Энэ нь үндсэн DNS тохиргоог хийж дуусгана. Домэйн бүртгэгчийн вэбсайт руу орж, одоогийн домэйн NS-үүдийг ClouDNS-ээс гаргасан хүмүүсээр солих шаардлагатай. NS-үүдийг шинэчлэхийн зэрэгцээ бид серверүүдийг бэлтгэх болно.

SSL сертификат суурилуулах

Манай CDN нь HTTPS дээр ажиллах тул хэрэв танд домэйн эсвэл дэд домайн SSL сертификат байгаа бол тэдгээрийг бүх серверүүд, жишээлбэл, лавлах руу байршуулна уу. /etc/ssl/таны домайн/

Хэрэв гэрчилгээ байхгүй бол 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 үүсгэж, түүнд нууц үг тохируулах шаардлагатай. Үр дүнд нь нууц үг бүхий auth-id файлд бичигдэнэ ~/.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

Таны харж байгаагаар бүх зүйл энгийн. Заавруудын ижил төстэй байдлаас шалтгаалан кэш хийх цагийг тохируулахад хүндрэл гардаг идэвхгүй и прокси_кэш_хүчинтэй. Тэдгээрийг өөрсдийн жишээн дээр дүн шинжилгээ хийцгээе. Хэзээ юу болохыг энд харуулав идэвхгүй = 7d и proxy_cache_хүчинтэй 90d:

  • хэрэв хүсэлт 7 хоногийн дотор давтагдахгүй бол энэ хугацааны дараа өгөгдлийг кэшээс устгах болно
  • Хэрэв хүсэлт дор хаяж 7 хоногт нэг удаа давтагдах юм бол кэш дэх өгөгдөл 90 хоногийн дараа хуучирсан гэж тооцогдох бөгөөд Nginx үүнийг анхны серверээс авч дараагийн хүсэлтээр шинэчлэх болно.

Засаж дууслаа nginx.conf, тохиргоог дахин ачаална уу:

root@cdn:~# service nginx reload

Манай CDN бэлэн боллоо. Сард 15 доллараар. Бид гурван тивд байрлах цэг, 3 TB замын хөдөлгөөнийг хүлээн авсан: байршил бүрт 1 TB.

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-ийн алдааг тэсвэрлэх чадварыг нэмэгдүүлэхийн тулд DNS Failover-ийг тохируулахыг зөвлөж байна, энэ нь сервер эвдэрсэн тохиолдолд A бичлэгийг хурдан өөрчлөхөд тусалдаг. Үүнийг домэйны хяналтын самбарын DNS бүртгэлд хийдэг.
  • Газарзүйн өргөн хүрээг хамарсан сайтууд нь олон тооны CDN шаарддаг нь эргэлзээгүй, гэхдээ фанатик байж болохгүй. Хэрэв та Европ, Хойд Америк (зүүн), Хойд Америк (баруун), Сингапур, Австрали, Хонг Конг эсвэл Япон гэсэн 6-7 байршилд сервер байршуулбал хэрэглэгч төлбөртэй CDN-тэй харьцуулахад мэдэгдэхүйц ялгааг анзаарахгүй байх магадлалтай.
  • Заримдаа хостууд түрээсийн серверүүдийг CDN зорилгоор ашиглахыг зөвшөөрдөггүй. Тиймээс, хэрэв та гэнэт контент хүргэх сүлжээг үйлчилгээ болгон ашиглахаар шийдсэн бол тодорхой хостинг үйлчилгээ үзүүлэгчийн дүрмийг урьдчилан уншихаа бүү мартаарай.
  • Судлах усан доорх харилцаа холбооны газрын зурагтивүүд хэрхэн холбогдож байгааг төлөөлж, контент хүргэх сүлжээг байгуулахдаа үүнийг анхаарч үзэх
  • Шалгаж үзээрэй өөр өөр газраас ирсэн пинг таны серверүүд рүү. Ингэснээр та CDN цэгүүдэд хамгийн ойр байгаа бүс нутгийг харж, GeoDNS-ийг илүү зөв тохируулах боломжтой болно
  • Даалгавруудаас хамааран Nginx-ийг кэш хийх тодорхой шаардлага, сервер дээрх ачааллыг харгалзан нарийн тохируулах нь ашигтай байх болно. Nginx кэшийн тухай нийтлэлүүд надад маш их тусалсан - энд хүнд ачааны дор ажлыг хурдасгах: энд и энд

Эх сурвалж: www.habr.com