شبکههای تحویل محتوا (CDN) در وبسایتها و برنامهها عمدتاً برای سرعت بخشیدن به بارگذاری عناصر استاتیک استفاده میشوند. این به دلیل ذخیره فایل ها در سرورهای CDN واقع در مناطق جغرافیایی مختلف اتفاق می افتد. با درخواست داده از طریق CDN، کاربر آن را از نزدیکترین سرور دریافت می کند.
اصل عملکرد و عملکرد همه شبکه های تحویل محتوا تقریباً یکسان است. سرور CDN پس از دریافت درخواست دانلود یک فایل، یک بار آن را از سرور اصلی می گیرد و در اختیار کاربر قرار می دهد و در عین حال آن را برای مدت زمان مشخصی کش می کند. تمام درخواست های بعدی از حافظه پنهان پاسخ داده می شود. همه CDN ها گزینه هایی برای پیش بارگیری فایل ها، پاک کردن حافظه پنهان، تنظیم تاریخ انقضا و موارد دیگر دارند.
این اتفاق می افتد که به هر دلیلی باید شبکه تحویل محتوای خود را سازماندهی کنید و سپس - اجازه دهید دستورالعمل های مونتاژ دوچرخه بعدی به ما کمک کند.
مواردی را در نظر بگیرید که اجرای CDN خود منطقی است:
زمانی که میل به صرفه جویی در پول و هزینه های جاری وجود دارد، حتی در هنگام استفاده از CDN های ارزان قیمت مانند BunnyCDN به چند صد دلار در ماه می رسد
اگر بخواهیم یک کش دائمی یا یک کش بدون سرور و کانال همسایه داشته باشیم
خدمات CDN در منطقه مورد نیاز شما نقاط حضور ندارند
هر گونه تنظیمات ویژه تحویل محتوا مورد نیاز است
ما می خواهیم با نزدیک تر کردن سرور تولید به کاربران، تحویل محتوای پویا را تسریع کنیم
این نگرانی وجود دارد که یک سرویس CDN شخص ثالث ممکن است به طور غیرقانونی اطلاعات مربوط به رفتار کاربر را جمع آوری یا استفاده کند (سلام سرویس های غیر منطبق با GDPR) یا درگیر سایر فعالیت های غیرقانونی شود.
در بیشتر موارد دیگر، استفاده از راه حل های آماده موجود مناسب تر است.
برای شروع به چه چیزی نیاز دارید
اگر سیستم خودمختار (AS) خود را داشته باشید، فوق العاده است. با آن می توانید همان IP را به چندین سرور اختصاص دهید و طبق این دستورالعمل در سطح شبکه، کاربران را به نزدیکترین آنها هدایت کنید. شایان ذکر است که حتی با بلوک آدرس /24 نیز می توان یک شبکه تحویل محتوا ساخت. برخی از ارائه دهندگان سرور به شما این امکان را می دهند که برای استفاده در همه مناطقی که در دسترس آنها است، اعلامیه ایجاد کنید.
اگر شما مالک خوشبخت بلوکی از آدرس های IP نیستید، برای اجرای یک CDN ساده به موارد زیر نیاز دارید:
نام دامنه یا ساب دامنه
حداقل دو سرور در مناطق مختلف. سرور می تواند اختصاصی یا مجازی باشد
ابزار geoDNS. با استفاده از آن، کاربر با آدرس دادن به دامنه، به نزدیکترین سرور هدایت می شود
ثبت دامنه و سفارش سرور
با ثبت دامنه، همه چیز ساده است - ما در هر منطقه با هر ثبت کننده ثبت نام می کنیم. شما همچنین می توانید از یک زیر دامنه برای CDN استفاده کنید، به عنوان مثال چیزی شبیه به cdn.domainname.com. در واقع، در مثال خود، ما دقیقاً این کار را انجام خواهیم داد.
در مورد سفارش سرورها، آنها باید در مناطق و کشورهایی که مخاطبان کاربر شما در آن قرار دارند، اجاره شوند. اگر پروژه بین قاره ای است، انتخاب ارائه دهندگان میزبانی که سرورها را به طور همزمان در سراسر جهان ارائه می دهند، راحت است. مثال ها: OVH, اجاره وب и 100 ترابایت - برای سرورهای اختصاصی، ولتر и DigitalOcean — برای ابر مجازی*.
برای CDN خصوصی خود، ما 3 سرور مجازی در قاره های مختلف سفارش خواهیم داد. در ولتر روی سرور برای 5 دلار در ماه خواهیم گرفت 25GB SSD مکان ها و 1 ترابایت ترافیک. هنگام نصب، آخرین Debian را انتخاب کنید. سرورهای ما:
فرانکفورت, IP: 199.247.18.199
شیکاگو, IP: 149.28.121.123
سنگاپور, IP: 157.230.240.216
* Vultr و DigitalOcean به کاربرانی که بلافاصله پس از افزودن روش پرداخت از طریق پیوندهای موجود در مقاله ثبت نام می کنند، 100 دلار اعتبار قول می دهند. نویسنده از این بابت تعارف کوچکی هم دریافت می کند که اکنون برای او بسیار قابل توجه است. لطفا درک کنید
راه اندازی geoDNS
برای اینکه کاربر هنگام دسترسی به دامنه یا زیر دامنه CDN به سرور مورد نظر (نزدیک ترین) هدایت شود، به یک سرور DNS با عملکرد geoDNS نیاز داریم.
اصل و عملکرد geoDNS به شرح زیر است:
IP کلاینت ارسال کننده درخواست DNS یا IP سرور DNS بازگشتی که هنگام پردازش درخواست مشتری استفاده می شود را مشخص می کند. چنین سرورهای بازگشتی معمولاً DNS ارائه دهندگان هستند.
IP مشتری کشور یا منطقه او را می شناسد. برای این کار از پایگاه داده های GeoIP استفاده می شود که امروزه تعداد زیادی از آنها وجود دارد. خوب وجود دارد گزینه های رایگان.
بسته به مکان مشتری، آدرس IP نزدیکترین سرور CDN را به او می دهد.
سرور DNS با عملکرد geoDNS می تواند باشد خودت جمع کن، اما بهتر است از راه حل های آماده با شبکه ای از سرورهای DNS در سراسر جهان و آنیکاست از جعبه:
CloudDNS از 9.95 دلار در ماه، تعرفه GeoDNS، به طور پیش فرض یک DNS Failover وجود دارد
CloudFlare را، ویژگی "Geo Steering" در طرح های Enterprise موجود است
هنگام سفارش geoDNS باید به تعداد درخواست های درج شده در تعرفه توجه کنید و در نظر داشته باشید که تعداد واقعی درخواست ها به دامنه می تواند چندین برابر انتظارات را بیشتر کند. میلیون ها عنکبوت، اسکنر، ارسال کننده هرزنامه و دیگر ارواح شیطانی به طور خستگی ناپذیر کار می کنند.
تقریباً تمام خدمات DNS شامل یک سرویس ضروری برای ساخت CDN - DNS Failover است. با کمک آن می توانید نظارت بر عملکرد سرورهای خود را تنظیم کنید و در صورت عدم وجود علائم حیات، به طور خودکار آدرس یک سرور غیرفعال را با یک نسخه پشتیبان در پاسخ های DNS جایگزین کنید.
برای ساخت CDN خود، از آن استفاده خواهیم کرد CloudDNS، تعرفه GeoDNS.
بیایید یک منطقه DNS جدید به حساب شخصی شما اضافه کنیم و دامنه خود را مشخص کنید. اگر در حال ساختن یک CDN بر روی یک زیر دامنه هستیم و دامنه اصلی از قبل در حال استفاده است، بلافاصله پس از افزودن منطقه، فراموش نکنید که رکوردهای DNS موجود را اضافه کنید. مرحله بعدی ایجاد چندین رکورد A برای دامنه / زیر دامنه CDN است که هر کدام در منطقه ای که ما مشخص کرده ایم اعمال می شود. شما می توانید قاره ها یا کشورها را به عنوان مناطق مشخص کنید، مناطق فرعی برای ایالات متحده آمریکا و کانادا در دسترس هستند.
در مورد ما، CDN در یک زیر دامنه افزایش می یابد cdn.sayt.in. با اضافه کردن یک منطقه sayt.in، اولین رکورد A را برای زیر دامنه ایجاد کنید و تمام آمریکای شمالی را به سرور در شیکاگو هدایت کنید:
بیایید عمل را برای مناطق دیگر تکرار کنیم، به یاد داشته باشیم که یک ورودی برای مناطق پیش فرض ایجاد کنیم. این چیزی است که در پایان اتفاق می افتد:
آخرین ورودی پیش فرض در تصویر به این معنی است که تمام مناطق نامشخص (و اینها اروپا، آفریقا، کاربران اینترنت ماهواره ای و غیره) به سرور در فرانکفورت ارسال می شوند.
این راه اندازی اولیه DNS را تکمیل می کند. باقی مانده است که به وب سایت ثبت کننده دامنه بروید و NS های دامنه فعلی را با موارد صادر شده توسط ClouDNS جایگزین کنید. و در حالی که NS ها به روز می شوند، سرورها را آماده می کنیم.
نصب گواهینامه های SSL
CDN ما روی HTTPS کار میکند، بنابراین اگر قبلاً گواهیهای SSL برای یک دامنه یا زیر دامنه دارید، آنها را در همه سرورها، به عنوان مثال، در دایرکتوری آپلود کنید. /etc/ssl/yourdomain/
اگر گواهی وجود ندارد، میتوانید یک گواهی رایگان از Let's Encrypt دریافت کنید. ایده آل برای این اسکریپت ACME Shell. سرویس گیرنده راحت و آسان برای راه اندازی است، و مهمتر از همه، به شما اجازه می دهد تا یک دامنه/زیر دامنه را توسط DNS از طریق ClouDNS API تأیید کنید.
ما acme.sh را فقط بر روی یکی از سرورها نصب خواهیم کرد - European 199.247.18.199، که از آن گواهینامه ها برای سایر سرورها کپی می شود. برای نصب، اجرا کنید:
در طول نصب اسکریپت، یک کار CRON برای تمدید بیشتر گواهینامه ها بدون مشارکت ما ایجاد می شود.
هنگام صدور گواهی، دامنه با استفاده از DNS با استفاده از API بررسی می شود، بنابراین در حساب شخصی ClouDNS در منوی Reseller API، باید یک API کاربر جدید ایجاد کنید و یک رمز عبور برای آن تعیین کنید. auth-id حاصل با رمز عبور در فایل نوشته می شود ~/.acme.sh/dnsapi/dns_cloudns.sh (با فایل اشتباه گرفته نشود dns_clouddns.sh). در اینجا خطوطی وجود دارد که باید بدون نظر و ویرایش شوند:
در گزینهها، برای آینده، دستوری را برای بارگیری خودکار پیکربندی وب سرور پس از هر تجدید دوره اعتبار گواهی در آینده مشخص کردهایم.
کل فرآیند دریافت گواهی می تواند تا 2 دقیقه طول بکشد، آن را قطع نکنید. اگر خطای اعتبارسنجی دامنه رخ داد، دوباره دستور را اجرا کنید. در پایان خواهیم دید که گواهینامه ها در کجا آپلود شده اند:
این مسیرها را به خاطر بسپارید، هنگام کپی کردن گواهینامه در سرورهای دیگر و همچنین در تنظیمات وب سرور باید مشخص شوند. ما به خطای بارگیری مجدد پیکربندی های Nginx توجه نمی کنیم - هنگام به روز رسانی گواهی ها روی یک سرور کاملاً پیکربندی شده نخواهد بود.
تنها چیزی که برای SSL باقی میماند این است که گواهی دریافتی را در دو سرور دیگر کپی کنیم و در عین حال مسیر فایلها را حفظ کنیم. بیایید دایرکتوری های یکسانی را روی هر یک از آنها ایجاد کنیم و یک کپی ایجاد کنیم:
حداکثر_اندازه - اندازه حافظه نهان، از فضای موجود دیسک تجاوز نمی کند
غیر فعال - زمان ذخیره سازی داده های کش که هیچ کس به آن دسترسی نداشته است
ssl_certificate и ssl_certificate_key - مسیرهای گواهی SSL و فایل های کلیدی
proxy_cache_valid - زمان ذخیره سازی داده های کش
پروکسی_گذر - آدرس سرور اصلی که CDN از آن فایلها را برای ذخیرهسازی درخواست میکند. در مثال ما، این sayt.in
همانطور که می بینید، همه چیز ساده است. مشکل تنها می تواند در تنظیم زمان کش به دلیل شباهت دستورالعمل ها ایجاد شود غیر فعال и proxy_cache_valid. بیایید با مثال خود آنها را تحلیل کنیم. در اینجا چه اتفاقی می افتد زمانی که غیر فعال = 7d и proxy_cache_valid 90d:
اگر درخواست طی 7 روز تکرار نشود، پس از این مدت داده ها از حافظه پنهان حذف می شوند
اگر درخواست حداقل هر 7 روز یک بار تکرار شود، داده های کش پس از 90 روز منسوخ تلقی می شوند و Nginx با درخواست بعدی، آن را از سرور اصلی به روز می کند.
ویرایش به پایان رسید nginx.conf، پیکربندی را دوباره بارگیری کنید:
root@cdn:~# service nginx reload
CDN ما آماده است. برای 15 دلار در ماه. ما نقاط حضور در سه قاره و 3 ترابایت ترافیک دریافت کردیم: 1 ترابایت در هر مکان.
بررسی کار CDN
بیایید به پینگ های CDN خود از مکان های جغرافیایی مختلف نگاه کنیم. هر سرویس پینگ برای این کار کار می کند.
نقطه پرتاب
میزبان
IP
میانگین زمان، ms
آلمان برلین
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 در این امر به من کمک زیادی کرد - اینجا و تسریع کار تحت بارهای سنگین: اینجا и اینجا