وقتی CDN فعال است، هر فایل قابل کش فقط یک بار (یا گاهبهگاه) از سرور اصلی دریافت میشود و بقیهٔ درخواستها از کش نودها پاسخ میگیرند. پس ترافیک خروجی سرور اصلی تقریباً به اندازهٔ بخش کشنشده کاهش مییابد. فرمول ساده: ترافیک سرور اصلی ≈ کل ترافیک × (۱ − نسبت کش). برای محاسبهٔ دقیق، حجم ترافیک را از لاگ Nginx بخوانید و نسبت کش را از پنل CDN بگیرید.
ترافیک سرور از کجا میآید؟
هر بار که کسی صفحهای از سایت شما را باز میکند، سرور HTML صفحه، تصاویر، فایلهای CSS و جاوااسکریپت، فونتها و گاهی ویدیو را برایش میفرستد. مجموع حجم این فایلها در یک ماه، ترافیک خروجی (دانلود) سرور شماست. در سایتهای معمولی، بخش بزرگ این حجم مربوط به فایلهای ثابت است: یک تصویر شاخص بهتنهایی میتواند از کل HTML صفحه بزرگتر باشد.
بسیاری از ارائهدهندگان سرور، ترافیک خروجی را محاسبه یا محدود میکنند. برای مثال در سرور ابری ایران کلودیفای، فقط ترافیک دانلود حساب میشود و هر گیگابایت ۱٬۲۵۰ هزینه دارد. پس هرچه ترافیک خروجی سرور کمتر باشد، هزینهٔ ماهانه پایینتر است. تفاوت ترافیک و پهنای باند را در پهنای باند یا ترافیک؟ توضیح دادهایم.
CDN چطور ترافیک را جابهجا میکند؟
با فعال شدن CDN، کاربران دیگر مستقیم به سرور شما وصل نمیشوند؛ درخواست به نزدیکترین نود CDN میرسد. اگر فایل در کش آن نود باشد (اصطلاحاً HIT)، مستقیم تحویل داده میشود و سرور شما اصلاً درگیر نمیشود. اگر نباشد (MISS)، نود فایل را از سرور اصلی میگیرد، به کاربر میدهد و برای دفعات بعد نگه میدارد.
پس ترافیک سرور اصلی فقط از دو منبع میآید:
- درخواستهایی که اصلاً قابل کش نیستند (صفحات پویا، APIها، بخش مدیریت).
- درخواستهای MISS: اولین درخواست هر فایل در هر نود، و درخواستهایی که پس از انقضای کش دوباره از مبدأ گرفته میشوند.
مفهوم کلیدی در این محاسبه نسبت کش یا Cache Hit Ratio است: سهمی از کل ترافیک که از کش تحویل داده شده است. بیشتر پنلهای CDN این عدد را نشان میدهند.
فرمول ساده
اگر کل ترافیکی که کاربران دریافت میکنند را T بنامیم و نسبت کش (بر اساس حجم) را h، آنگاه:
- ترافیکی که CDN از کش تحویل میدهد ≈ T × h
- ترافیکی که از سرور اصلی خارج میشود ≈ T × (۱ − h)
دقت کنید که نسبت کش را بر اساس حجم در نظر بگیرید، نه تعداد درخواست. ممکن است تعداد زیادی درخواست کوچک API کش نشوند اما حجم کمی داشته باشند، در حالی که تعداد کمتری تصویر بزرگ از کش تحویل شوند و بیشتر حجم را تشکیل دهند.
مثال عددی گامبهگام
یک فروشگاه اینترنتی فرضی را در نظر بگیرید. اعداد زیر فرضیاند و فقط برای نشان دادن روش محاسبه آمدهاند؛ اعداد سایت خودتان را با روش بخش بعد اندازه بگیرید.
- کل ترافیک ماهانه: فرض کنید کاربران در ماه ۸۰۰ گیگابایت داده دریافت میکنند.
- سهم فایلهای ثابت: از لاگها مشخص میشود حدود ۷۰۰ گیگابایت مربوط به تصاویر، CSS، JS و فونتهاست و ۱۰۰ گیگابایت مربوط به HTML و API.
- کشپذیری: فایلهای ثابت کش میشوند؛ فرض کنید از این ۷۰۰ گیگابایت، ۶۵۰ گیگابایت از کش تحویل میشود و ۵۰ گیگابایت MISS است. HTML و API کش نمیشوند.
- ترافیک سرور اصلی با CDN: ۵۰ گیگابایت MISS + ۱۰۰ گیگابایت پویا = ۱۵۰ گیگابایت.
- نتیجه: ترافیک خروجی سرور اصلی از ۸۰۰ به ۱۵۰ گیگابایت کاهش یافته است.
حالا هزینهٔ دو طرف را مقایسه کنید: ۶۵۰ گیگابایتی که از سرور اصلی حذف شد، اکنون از CDN تحویل میشود و CDN هم بر اساس حجم هزینه دارد. پس صرفهجویی واقعی به تفاوت هزینهٔ هر گیگابایت ترافیک سرور با هر گیگابایت CDN بستگی دارد. در کلودیفای، تعرفهٔ فعلی هر گیگابایت CDN ۱٬۰۰۰ و ترافیک دانلود سرور ایران ۱٬۲۵۰ برای هر گیگابایت است. با جایگذاری اعداد سایت خودتان در همین فرمول، هزینهٔ هر دو حالت را دقیق مقایسه کنید.
فراتر از هزینهٔ مستقیم، دو صرفهجویی دیگر هم وجود دارد: سرور اصلی بار کمتری تحمل میکند و ممکن است با پلن کوچکتری کار کند، و در زمان اوج بازدید، سرور کمتر در معرض اشباع پورت و منابع است.
اندازهگیری ترافیک واقعی از لاگ Nginx
برای محاسبهٔ دقیق، باید بدانید چه حجمی از ترافیک شما مربوط به فایلهای ثابت است. لاگ دسترسی Nginx حجم هر پاسخ را ثبت میکند. این دستور حجم را بر اساس پسوند فایل جمع میزند:
awk '{split($7,a,"?"); n=split(a[1],p,"."); ext=(n>1)?p[n]:"html"; s[ext]+=$10} END {for (e in s) printf "%-8s %.2f GB\n", e, s[e]/1024/1024/1024}' /var/log/nginx/access.log | sort -k2 -nr | head
این دستور فرض میکند لاگ در قالب پیشفرض combined است که ستون هفتم آدرس و ستون دهم حجم پاسخ است. خروجی نشان میدهد هر نوع فایل چند گیگابایت ترافیک ساخته است. اگر jpg، png، webp، mp4، js و css بخش بزرگی از جمع را تشکیل میدهند، CDN صرفهجویی زیادی ایجاد میکند.
برای پایش کلی ترافیک سرور، ابزار vnStat هم مفید است:
sudo apt install -y vnstat
vnstat -m
$ vnstat -m month rx | tx | total ... ... GiB | ... GiB | ... GiB$ awk '{s+=$10} END {printf "%.2f GB\n", s/1024^3}' /var/log/nginx/access.log... GB$
بالا بردن نسبت کش
هرچه نسبت کش بالاتر باشد، ترافیک کمتری به سرور اصلی میرسد. این تنظیمات بیشترین اثر را دارند:
- مدت کش طولانی برای فایلهای ثابت: با هدر
Cache-Control: public, max-age=...مدت کش را طولانی کنید. آموزش در قوانین Cache-Control در CDN. - نسخهگذاری فایلها: بهجای کوتاه کردن مدت کش، نام فایل یا پارامتر نسخه را با هر تغییر عوض کنید.
- حذف پارامترهای بیاثر از کلید کش: پارامترهایی مثل
utm_sourceباعث میشوند یک فایل با چند آدرس مختلف کش شود. - عدم ارسال کوکی برای فایلهای ثابت: برخی CDNها پاسخهای دارای
Set-Cookieرا کش نمیکنند. - کش HTML برای مهمانان: اگر سایت محتوایی دارید، کش کوتاهمدت صفحات برای کاربران واردنشده سهم بزرگی از ترافیک باقیمانده را هم حذف میکند.
کاهش کل ترافیک، نه فقط جابهجایی آن
CDN ترافیک را از سرور به CDN منتقل میکند، اما حجم کل را کم نمیکند. برای کاهش واقعی حجم:
- تصاویر را به WebP یا AVIF تبدیل و در ابعاد واقعی نمایش ذخیره کنید.
- فشردهسازی Gzip یا Brotli را برای فایلهای متنی فعال کنید (آموزش).
- ویدیوها را با کیفیت تطبیقی و فقط هنگام پخش بارگذاری کنید.
- اسکریپتها و فونتهای بلااستفاده را حذف کنید.
هر گیگابایتی که اصلاً منتقل نشود، نه هزینهٔ سرور دارد و نه هزینهٔ CDN.
جمعبندی
برای تصمیمگیری دربارهٔ CDN، سه عدد لازم دارید: کل ترافیک ماهانه، سهم فایلهای قابل کش و هزینهٔ هر گیگابایت در سرور و CDN. با فرمول سادهای که دیدید، اثر CDN را پیش از فعالسازی تخمین بزنید و پس از فعالسازی، با نسبت کش واقعی پنل CDN و لاگ سرور، دقیقش کنید. برای شروع، صفحهٔ CDN کلودیفای را ببینید.
سؤالات متداول
آیا CDN همیشه هزینه را کم میکند؟
نه همیشه. اگر بیشتر ترافیک سایت پویا و غیرقابل کش باشد، یا هزینهٔ هر گیگابایت CDN از ترافیک سرور بیشتر باشد، صرفهجویی مستقیم کم است؛ هرچند کاهش بار سرور و پایداری بیشتر همچنان ارزشمند است.
نسبت کش خوب چقدر است؟
عدد ثابتی وجود ندارد و به نوع سایت بستگی دارد. سایتهای محتوایی با فایلهای ثابت زیاد معمولاً نسبت کش بسیار بالایی دارند و سرویسهای API نسبت پایینی. مهم این است که فایلهای ثابت شما تقریباً همیشه HIT باشند.
چرا با وجود CDN ترافیک سرورم کم نشد؟
احتمالاً هدرهای کش درست تنظیم نشدهاند، پاسخها کوکی دارند یا پارامترهای متغیر در آدرسها باعث MISS میشوند. هدر وضعیت کش را در پاسخها بررسی کنید و قوانین کش را اصلاح کنید.
ترافیک آپلود هم با CDN کم میشود؟
CDN بیشتر روی ترافیک خروجی سرور اثر دارد. فایلهایی که کاربران آپلود میکنند معمولاً از CDN عبور میکنند و به سرور اصلی میرسند؛ در سرور ایران کلودیفای ترافیک آپلود رایگان است.
از ۱٬۲۰۰ تومان در ساعت · پرداخت ریالی



