منبع اصلی نوشتار زیر در این لینک قرار دارد

Content Delivery Network

اگه دقت کرده باشید، جدیدا عکسهای توی بلاگ و فایلهای آپلود شده و کلا همه این چیزها از یه دومین دیگه بارگذاری میشه، به اسم static.cyberrabbits.net
البته این وبلاگ آنچنان بازدید کننده ای نداره که منو وادار به اینکار کرده باشه :) ولی به هر حال هدفم ایجاد یه CDN بود (و این که من یه Geek هستم!)و بعد از یه کم دردسر موفق شدم. (نه کاملا!)
Content Delivery Network یا همون CDN یه تکنیکه که برای افزایش سرعت سایت میشه ازش استفاده کرد.
اگه افزونه Y!Slow رو دیده باشید مدام گیر میده که چند تا فایل هستن که روی CDN نیستن. اگه به سایتهای بزرگ رو دقت بکنید، عکسهاشون معمولا از یه دومین دیگه بارگذاری میشه. خوب این CDN چیه دقیقا؟
CDN در اصل یه دومین CookieLess هستش. این بدون کوکی بودن یکی از مهمترین قسمتهای این قضیست.
البته همه قضیه نیست :)‌ ممنون از دوستی که تذکر دادن، علاوه بر بدون کوکی بودن، CDN برای انتخاب نزدیکترین و سریعترین منبع به کاربر هم استفاده میشه و وقتی کاربرد داره که از اطلاعات استاتیک سایتتون چند تا (دست کم یک ) Mirror داشته باشید. منتها تو این بحث و برای وبلاگ نویسها و طراحایی مثل من،‌ این قسمت بحث مطرح نیست، چون عملا امکان ایجاد Mirror برام وجود نداره.
کوکی رو حتما میدونید چیه، و میدونید که به ازای هر درخواست، کلیه کوکی های اون سایت مورد درخواست، برای اون سایت ارسال میشه و این یعنی افزایش حجم درخواست. در نظر اول شاید بگید که یه کوکی حجم آنچنانی نداره. خوب، حق با شماست. اگه کل کوکی های یک سایت رو سر هم بذاریم بعیده به یک کیلوبایت برسه. (البته برای یک مهمان، برای مدیر سایت و کسانی که عضو هستن ممکنه خیلی بیشتر از این حرفها باشه) در عمل، یه سایت تشکیل شده از تعداد زیادی درخواست. مثلا صفحه اول همین بلاگ :

میبینید که شده ۴۲ درخواست. و اگه بدونید برای همه این درخواستها کوکی هم ارسال میشه. برای اونها که دینامیک هستن، مثل صفحات PHP کوکی لازمه، ولی مثلا برای همین عکس بالایی کوکی چه اسفاده ای داره؟ یعنی اگه کوکی باشه و کوکی نباشه این عکس تغییر میکنه؟
خوب حالا برای من، کوکی ها در حدود ۱ کیلوبایت هستن و این یعنی که ۴۲ بار این کوکی ها برای این سایت ارسال شدن، ولی این کوکی ها جز برای ۳ یا ۴ صفحه، برای فحات و عکسها و جاوااسکریپتهای دیگه لازم نیستن. یعنی به ازای هربار دیدن صفحه، ۳۴-۳۵ کیلو بایت ارسالی اضافه!
مهم نیست که صفحه cache شده باشه، بالاخره توی درخواست کوکی ارسال میشه و هیچ کاریش نمیشه کرد! نگاه نکنید که کلی از آیتمهای عکس بالایی Cache شدن و پاسخ ۳۰۴ گرفتم، مهم اینه که وقت درخواست این کوکی ارسال شده.
خوب این هر چی نباشه سرعت رو میاره پایین. (تو ابعاد بالا، با یه سایت بزرگ با درخواست بالا، میشه کلی ترافیک الکی!! یکی از راههایی که شاید مسخره باشه ولی تو DOS میتونه جواب بده اینه که کوکی درخواست رو تا حد ممکن اضافه کنیم و البته Content رو، این یعنی یه قدم نزدیک تر به موفقیت توی DOS !!)

برای رها شدن از این کوکی ها چیکار کنیم؟ یه دومین دیگه میتونه خیلی مفید باشه. این دومین دیگه، میشه حاوی عکسها و شما آدرسهای استاتیک رو از این دومین دیگه میدید. به این دومین دیگه میگیم CDN.

اگه یه دومین بیکار دارید که خیلی خیلی خوب میتونید برای این منظور ازش استفاده کنید اگر نه هم میشه از همین روشی که من استفاده کردم استفاده کنید(که خیلی دردسر داره و اصلا توصیه نمیکنم! تازه من در آخر موفق نشدم کاملا!).

برای اینکار لازمه که تمام ترافیک فایلهای استاتیک که با کوکی کاری ندارن رو بندازید روی آدرس بدون کوکی.

گام اول اضافه کردن این دومینه. زیاد منطقی نیست که یه دومین با فضای کلا جدا ایجاد کنید. به جای اینکار بهتره یه دومین دیگه روی همون هاست تنظیم بشه. اگه یه دومین اضافه داشته باشید که همه چی حله(من متاسفانه فعلا ندارم! ولی به زودی خواهم داشت). و گرنه باید یه sub domain بسازید.

اول از همه نیاز دارید که یه رکورد CNAME اضافه کنید. من روی پلسک اینکار رو انجام دادم و مراحل کار اینجوری بود :

Canonical name یا همون CName میشه آدرس سایت شما.

بعد کافیه این sub domain رو پارکش کنید روی ریشه هاست (یعنی در عمل static.cyberrabbits.net برای من با cyberrabbits.net یک جا میشن) خوب، تا اینجا همه چی آمادست. از این به بعد،‌میتونید آدرس فایلهای استاتیک رو به جای اینکه از ریشه بدید، از طریق این sub domain ارایه کنید. مثلا این آدرس که کلی کوکی داره :


http://cyberrabbits.net/wp-content/uploads/2010/12/regex.png

میشه این آدرس که کوکی نداره :


http://static.cyberrabbits.net/wp-content/uploads/2010/12/regex.png

و در عمل هر دو یه فایل هستن. علاوه بر این بدون کوکی بودن، اینکار باعث میشه که مرورگر دیگه همه فایلها رو روی یک دامنه ندونه و بتونه به صورت موازی چند تا درخواست رو بفرسته (اگه تقسیم فایلها بین سایت اصلی و CDN درست و مساوی باشه، مرورگر خیلی بهتر این صفحات رو بارگذاری میکنه). البته این مساله زیاد مهم نیست.
حالا دیگه میتونید آدرسهای استاتیک، مثل عکسها و جاوااسکریپت و CSS رو از روی این آدرس مجازی بارگذاری کنید.

در صورتی که از یه دومین جداگانه استفاده میکنید که خوب مشکلی نیست، ولی در صورتی که از sub domain استفاده کنید یه مشکل پیش میاد و اون اینه که ما وقت برنامه نویسی چه کار کنیم که کوکی ها روی این CDN تنظیم نشن؟ برای تنظیم کوکی در PHP باید اینجوری عمل بشه :

setcookie('testCookie','testValue',time()+7*24*60*60,'/','www.cyberrabbits.net');

آرگومان آخره که مهمه.فقط اسم دومین رو مینویسم. اینجوری کوکی فقط برای خود سایت تنظیم میشه نه همه sub domain ها.
اگه این دومین تنظیم نشه اونوقت PHP کوکی رو برای همه دومین ها تنظیم میکنه و این شامل CDN هم میشه که این کلا با هدف اولیه ما تناقض داره. همین طور کوکی مربوط به session که اونهم باید از طریق تابع session_set_cookie_params باید طوری تنظیم بشه که فقط روی دومین اصلی کار کنه.

اگه مثل من، شما هم www رو حذف کردید تا همین لحظه! راهی یافت نکردم که بشه کوکی رو محدود کرد فقط به خود سایت :( و حتی تو RFC 2109 – HTTP State Management Mechanism (RFC2109) هم صریحا گفته شده که اینجوری نمیشه کوکی رو تنظیم کرد!

وقتی از sub domain استفاده بشه مشکل یکی و دو تا نیست. شما باید خیلی چیزهای دیگه رو هم در نظر بگیرید. مثلا Google Analytics خودش یه سری کوکی تنظیم میکنه که باید جلوی اون هم گرفته بشه،اون زیاد سخت نیست، میشه اینطور نوشت :

_gaq.push(
    ['_setAccount', 'UA-xxxxxxx-1'],
    ['_setDomainName', 'www.example.com'],
    ['_trackPageview']
);

یا :

var pageTracker = _gat._getTracker("UA-xxxxxxx-1");

pageTracker._setDomainName("www.example.com");
pageTracker._initData();

pageTracker._trackPageview();

اضافه کردن اون خط مربوط به setDomainName مشکل رو دست کم برای این سرویس گوگل حل میکنه.

بازم هست :( و به نظرم همون پارک کردن یه دومین جدا بهتره!! البته سرویس To Static It! هم هست که متاسفانه فعلا سرویس نمیده … انگار امسال قرار نیست که موفق بشم!
باز هم مینویسم چون این مبحث حقیقتا نیاز به توضیح بیشتر داره و بحث بیشتر. این که الان من نوشتم فقط یه مقدمه بود. دفعه های بعدی یه کم درباره وردپرس مینویسم و چطور میشه این CDN رو روی اون هم پیاده کرد.
–یادم هست، پست نصفه نیمه زیاد دارم، یه بخش از zenity مونده، عبارات باقاعده نیمه تمومه هنوز، اینم یکی دیگه!! (همین CDN) سعی میکنم به زودی همه رو تکمیل کنم، به خودم هم قول دادم که دیگه این شاخه به اون شاخه نکنم!
– متاسفانه این نوشته یه کم بی سر و سامون شد. خیلی وقته دارم سعی میکنم این متنو بنویسم ولی مشکلاتی بوده که تا به حال حل نشده :) حل که شد اونوقت بیشتر و بهتر در مورد این CDN مینویسم.



برچسب ها : , , , , , ,