چرا راهاندازی CDN برای فایلهای استاتیک حیاتی است؟
وقتی صحبت از سرعت بارگذاری وبسایت میشود، فایلهای استاتیک (تصاویر، CSS، JavaScript، فونتها و ویدیوها) معمولاً بیش از ۷۰٪ از حجم کل صفحه را تشکیل میدهند. اگر این فایلها را مستقیم از سرور اصلی سرو کنید، هر درخواست کاربر به دیتاسنتر شما میرود؛ حتی اگر کاربر در آن سوی کره زمین باشد. نتیجه؟ تأخیر بالا، مصرف پهنای باند زیاد و تجربه کاربری ضعیف.
راهاندازی CDN (شبکه توزیع محتوا) این مشکل را حل میکند: فایلهای استاتیک روی چندین سرور در نقاط مختلف دنیا کپی میشوند و درخواست کاربر به نزدیکترین سرور (PoP) هدایت میشود. اما نکته مهم این است که صرفاً فعالکردن CDN کافی نیست؛ اگر تنظیمات کش و باطلسازی محتوا را درست انجام ندهید، کاربران شما نسخههای قدیمی فایلها را میبینند یا کش به درستی کار نمیکند. در این مقاله، راهاندازی CDN را از صفر تا صد با تمرکز بر اتصال دامنه، تنظیم کش و باطلسازی محتوای قدیمی پیش میبریم.
مرحله ۱: انتخاب معماری و اتصال دامنه به CDN
قبل از هر کاری، باید تصمیم بگیرید که دامنه اصلی شما (مثلاً example.com) مستقیماً به CDN اشاره کند یا از یک زیردامنه جداگانه (مثل cdn.example.com) استفاده کنید. برای فایلهای استاتیک، بهترین روش استفاده از زیردامنه جداگانه است؛ چون میتوانید تنظیمات کش را مستقل از دامنه اصلی کنترل کنید و در صورت بروز مشکل، بهسرعت CDN را غیرفعال کنید.
اتصال دامنه از طریق رکورد CNAME
بعد از ایجاد یک CDN (مثلاً در Cloudflare، Fastly یا سرویس CDN سرورنت)، یک رکورد CNAME در DNS خود اضافه کنید:
cdn.example.com. CNAME your-cdn-endpoint.example.net.
اگر CDN شما آدرس IP ثابت میدهد (در برخی سرویسها)، بهجای CNAME از رکورد A استفاده کنید:
cdn.example.com. A 203.0.113.10
نکته مهم: اگر از رکورد CNAME استفاده میکنید، مطمئن شوید که TTL را روی مقدار پایین (مثلاً ۳۰۰ ثانیه) تنظیم کردهاید تا در صورت تغییر endpoint، بهسرعت اعمال شود.
تنظیم SSL و HTTPS
برای جلوگیری از خطای mixed content، حتماً SSL را روی زیردامنه CDN فعال کنید. اگر CDN شما گواهی خودکار صادر میکند (مثل Let's Encrypt)، فقط کافی است گزینه SSL/TLS را در پنل فعال کنید. در غیر این صورت، گواهی را بهصورت دستی آپلود کنید. بعد از فعالسازی، تست کنید که https://cdn.example.com بهدرستی پاسخ میدهد.
مرحله ۲: تنظیم کش (Cache) برای فایلهای استاتیک
تنظیم کش قلب راهاندازی CDN است. اگر کش را درست پیکربندی نکنید، CDN فقط یک پروکسی معمولی خواهد بود و هیچ سرعتی اضافه نمیکند. دو سطح کش داریم: کش مرورگر (با هدرهای HTTP) و کش CDN (در سطح PoP).
تنظیم Cache-Control و Expires
برای فایلهای استاتیک که تغییر نمیکنند (مثل لوگو، فونتها)، میتوانید کش طولانیمدت تنظیم کنید:
Cache-Control: public, max-age=31536000, immutable
این هدر به مرورگر و CDN میگوید که فایل را برای یک سال کش کند و چون immutable است، مرورگر حتی درخواست revalidation هم نمیفرستد. برای فایلهایی که ممکن است تغییر کنند (مثل CSS یا JS اصلی)، از مقدار کوتاهتر استفاده کنید:
Cache-Control: public, max-age=3600, must-revalidate
در سرویسدهنده وب (مثلاً Nginx)، میتوانید این هدرها را بهصورت زیر تنظیم کنید:
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header CDN-Cache-Control "public, max-age=31536000";
}
توجه کنید که هدر CDN-Cache-Control مخصوص CDN است و به شما اجازه میدهد کش CDN را مستقل از کش مرورگر تنظیم کنید. این کار بسیار مفید است؛ مثلاً میخواهید مرورگر فایل را ۱ روز کش کند، اما CDN آن را ۱ سال نگه دارد.
تنظیم کش در پنل CDN
در پنل CDN خود، یک قانون (Rule) برای پسوندهای استاتیک ایجاد کنید. معمولاً این قوانین به شکل زیر هستند:
- Path pattern:
/*.css،/*.js،/*.png - Cache TTL: ۳۰ روز یا ۱ سال
- Cache behavior: Cache everything (حتی اگر کوئریاسترینگ داشته باشد)
یک اشتباه رایج این است که کش را روی Cache only if query string is empty تنظیم میکنید. این کار باعث میشود اگر فایلی با ?v=2 درخواست شود، کش نشود و دوباره به سرور اصلی برگردد. برای فایلهای استاتیک، بهتر است گزینه Ignore query string را فعال کنید.
مرحله ۳: باطلسازی محتوای قدیمی (Cache Purge)
مهمترین چالش بعد از راهاندازی CDN، باطلسازی کش است. وقتی یک فایل CSS را تغییر میدهید، اگر کش قدیمی هنوز در PoP ها موجود باشد، کاربران نسخه قبلی را میبینند. سه روش اصلی برای این کار دارید:
روش ۱: Purge دستی از پنل
اکثر CDN ها یک دکمه Purge یا Clear Cache در پنل دارند. میتوانید یک URL خاص یا کل دامنه را پاک کنید. این روش برای مواقع اضطراری خوب است، اما برای استقرارهای مکرر (Deployment) مناسب نیست.
روش ۲: Purge از طریق API
بهترین روش برای اتوماسیون، استفاده از API است. مثلاً در Cloudflare، درخواست زیر را ارسال میکنید:
curl -X POST "https://api.cloudflare.com/client/v4/zones/{zone_id}/purge_cache" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
--data '{"files":["https://cdn.example.com/css/style.css"]}'
این درخواست فقط فایل مشخصشده را پاک میکند. اگر میخواهید همه چیز را پاک کنید، از {"purge_everything":true} استفاده کنید. در اسکریپت استقرار خود (مثلاً در CI/CD)، بعد از آپلود فایلهای جدید، این API را صدا بزنید.
روش ۳: استفاده از Cache Busting (تغییر نام فایل)
بهجای باطلسازی کش، میتوانید نام فایل را تغییر دهید. مثلاً بهجای style.css از style.abc123.css استفاده کنید. این کار با ابزارهایی مثل Webpack یا Vite بهصورت خودکار انجام میشود. مزیت این روش این است که نیازی به Purge ندارید و فایلهای قدیمی بهمرور از کش خارج میشوند. اما معایب آن: حجم فضای اشغالشده در CDN بیشتر میشود و اگر فایلهای قدیمی را از سرور حذف کنید، ممکن است لینکهای قدیمی (که در صفحات ایندکس شدهاند) خطای ۴۰۴ بدهند.
اشتباه رایج: فراموشکردن نسخهبندی در HTML
بسیاری از توسعهدهندگان فقط کش را پاک میکنند، اما فراموش میکنند که مرورگر کاربر هنوز نسخه قدیمی HTML را دارد که به فایل قدیمی لینک میدهد. راهحل: در HTML خود، نسخه فایل را بهصورت دستی یا خودکار اضافه کنید:
<link rel="stylesheet" href="https://cdn.example.com/css/style.css?v=20250601">
اگر از روش Cache Busting با هش فایل استفاده میکنید، این مشکل خودبهخود حل میشود.
مرحله ۴: مانیتورینگ و عیبیابی
بعد از راهاندازی CDN، باید مطمئن شوید که همه چیز درست کار میکند. چند ابزار و تکنیک برای این کار:
بررسی هدرهای پاسخ
با دستور زیر میتوانید هدرهای یک فایل را بررسی کنید:
curl -I https://cdn.example.com/css/style.css
در خروجی، به دنبال این موارد باشید:
cache-status: HIT(یعنی فایل از کش CDN سرو شده)age: 12345(مدت زمانی که فایل در کش بوده)x-cache: HIT(در برخی CDN ها)
اگر MISS میبینید، یعنی فایل از سرور اصلی آمده و کش نشده است. این معمولاً به این معنی است که هدرهای کش بهدرستی تنظیم نشدهاند.
تست از نقاط مختلف
از ابزارهایی مثل ping یا سرویسهای آنلاین (مثل check-host.net) استفاده کنید تا مطمئن شوید که از نقاط مختلف دنیا، درخواست به نزدیکترین PoP میرود. اگر همه درخواستها به یک IP میروند، احتمالاً DNS شما درست تنظیم نشده یا CDN شما PoP کافی ندارد.
عیبیابی خطای ۵۰۲ و ۵۰۴
اگر بعد از راهاندازی CDN خطای ۵۰۲ یا ۵۰۴ میبینید، معمولاً مشکل از ارتباط CDN با سرور اصلی است. این موارد را بررسی کنید:
- آیا سرور اصلی فقط از IP های خاصی اجازه اتصال میدهد؟ (فایروال را بررسی کنید)
- آیا SSL سرور اصلی معتبر است؟ (اگر CDN نتواند SSL را تأیید کند، خطا میدهد)
- آیا هاست شما محدودیت تعداد اتصال همزمان دارد؟ (CDN ها اتصالات زیادی باز میکنند)
جمعبندی و بهترین روشها
راهاندازی CDN برای فایلهای استاتیک فقط یک تنظیم ساده نیست؛ بلکه یک فرایند شامل اتصال دامنه، تنظیم دقیق کش و مدیریت باطلسازی است. خلاصه نکات کلیدی:
- از زیردامنه جداگانه (
cdn.example.com) استفاده کنید. - هدر
Cache-Controlرا باimmutableبرای فایلهای تغییرناپذیر تنظیم کنید. - از
CDN-Cache-Controlبرای جداسازی کش مرورگر و CDN استفاده کنید. - برای استقرارهای مکرر، Purge از طریق API را در CI/CD خود ادغام کنید.
- از Cache Busting با هش فایل استفاده کنید تا نیاز به Purge کاهش یابد.
- همیشه بعد از تغییرات، هدرهای پاسخ را با
curl -Iبررسی کنید.
اگر به دنبال یک راهحل یکپارچه هستید، سرویسهای CDN که توسط ارائهدهندگان هاستینگ ابری مثل سرورنت ارائه میشوند، معمولاً این امکانات را بهصورت آماده دارند و میتوانید بدون دردسر زیرساخت، از همین تنظیمات استفاده کنید. اما مهم است که مفاهیم این مقاله را درک کنید تا بتوانید هر CDN ای را بهدرستی مدیریت کنید.
در نهایت، به یاد داشته باشید که راهاندازی CDN یک کار یکباره نیست؛ نیاز به مانیتورینگ مداوم و تنظیم مجدد بر اساس رفتار کاربران و تغییرات سایت شما دارد. با رعایت نکات بالا، میتوانید سرعت سایت خود را بهطور چشمگیری افزایش دهید و تجربه بهتری برای کاربران خود بسازید.