
Varnish عبارة عن reverse proxy يوضع أمام الخادمات لتوفير خاصية caching مما سيخفف العبئ على خادمات المواقع وقواعد البيانات في المؤخرة، ناهيك عن زيادة الأمان. فعوضا من زيادة عدد خادمات المواقع وقواعد البيانات ممكن حل هذه المشكلة بواسطة هذه الطريقة.
تم تصميمه منذ البداية ليكون reverse proxy فهو تخصصي أكثر، بينما squid-cache تم تصميمه كـforward cache ولاحقا أضافوا خاصية الـreverse caching. كذلك الـsoftware archeticture للـVarnish مختلف جذريا مقارنة بـsquid-cache مما يؤدي إلى سرعة تفوقه بعدة أضعاف. لمزيد من تفاصيل التصميم راجعوا هذه الصفحة.
يستخدم لغة خاصة بها في ملف الإعدادات، مسماة بـVCL - Varnish Config Language. هذه اللغة مرنة وتسمح بالتحكم بتفاصيل الـcaching. هذه اللغة تشبه لغات الإسكريبتينج، داخليا يستخدمه Varnish بعد اجراء عملية compile للـVCL file.
هناك عدة خواص مدعومة كلغة ESI - Edge Side Includes. هذه اللغة تم انشاؤها بواسطة مجموعة شركات عملاقة، وتم تقديمها إلى W3C للموافقة عليها كـstandard. حتى الآن لم تصدر الموافقة لكن نظرا لفائدتها الجلية نجد العديد قام بتوفيرها. مثلا Big IP WebAccelerator يقوم بتوفير ESI إضافة إلى Squid-Cache.
بإذن الله، سيكون هذا الموضوع شرحا للتنصيب والإعداد مصحوبا بأمثلة لصفحة موقع تستخدم هذه الخاصية.
تمهيد:
بما أن معظم الناس لا يعلمون ماذا أقول، سأدخل قليلا في آلية عمل صفحات الـweb والـserver-side script و قواعد البيانات. وبعدما يكون الأساس راسخا سأبدا في صلب الموضوع، وهو Varnish وطريقة عمله كـReverse Cache لتخفيف الضغط على الخادمات لزيادة سرعة تصفح الزائر عبر الشبكة.
السيناريو:
لدينا خادم يعرض صفحة ديناميكية. لذا، فالخادم لا يضع last modified time stamp في الـhttp header، لأنه لا يدري متى تم تحديث الصفحة. حيث أن الصفحة تستمد معلوماتها من قاعدة البيانات ومصادر أخرى ديناميكية. وكنتيجة لهذا، متصفحات الإنترنت (كفايرفوكس) لن تقوم بتخزين نسخة محلية للزيارات اللاحقة (لا يوجد caching). ونفس الشيء ينطبق على البروكسيات (forward proxies) في المنتصف، كتلك المستخدمة في مزودات خدمة الإنترنت أو الشركات أو الجامعات، لن تستخدم الكاش.
المشكلة:
بما أنه لا أحد يستخدم الكاشينج، ستأتي مشكلة، وهي أن كل يزور شخص الصفحة، حتى لو زائر سابق وإن لم تتغير الصفحة، سيتطلب الأمر execute لكود الـserver side script كـPerl أو PHP أو ASP..الخ. وفي فترة الـexecute سيتم إرسال SQL query لقاعدة بيانات في المؤخرة لإستخراج البيانات المطلوبة، وثم إرسال المعطيات إلى العميل.
الحلول التقليدية:
المشكلة المذكورة بالأعلى، مقبولة في البيئات الديناميكية الصغيرة، لكن في البيئات الديناميكية الأكبر قد يظهر بطئ شديد على الموقع، وعنق الزجاجة سيكون الـscript execution أو الـsql query أو الإثنين، قبل أن يكون الـbandwidth.
أحد الحلول أن نستخدم (مثلا) php caching، و mysql caching. صحيح أن هذه الطرق ستخفف كثيرا من التأخير، لكنها لن تخفف كالـhttp cache. والسبب ببساطة أن (مثلا) mysql cache سيعتمد في النهاية على إرسال بكت query packet وثم استقبال reply packet.
بينما الـhttp caching سيكون مباشرة من الكاش نفسه دون اي query لاي جهة أخرى. السرعة ستكون كبيرة وشبه لحظية. هذه وظيفة reverse cache يوضع أمام الموقع ليواجه طلبات الزوار من الإنترنت. من خلاله ممكن نقول له "قم بكاشينج لكل صفحة مدة 5 دقائق". هكذا سيخف الضغط بشكل ملحوظ على خادم الموقع وقاعدة البيانات. لكن هناك مشكلة، بل عدة مشاكل، وهي:
- هذا قد يصلح للمواقع التي تتجدد كل 5 دقائق، لكن ماذا عن مواقع الدردشة والمنتديات؟
- ربما محتوى الموقع يتجدد كل سنة مرة، لكن الموقع يحتوي على هيدر مفصل به رسالة ترحيبيه للعضو الذي قام بـlogin. هنا مصيبة، فبهذا الكاش سيقوم أي زائر بمشاهدة اسم الزائر الذي دخل قبله مع الكوكيز الخاصة به. وإذا قلنا للبروكسي بمسح الكوكيز، فحينها مشكلة أخرى وهي أنه لا يستطيع أحد عمل Login على حسابه بالكلية!
طريقة كاشين أخرى وهي من خلال استخدام IMS - If Modified Sinse لكن عيبها صعوبة التطبيق. كما أن الفائدة منها ستقل كلما زاد معدل تحديث الصفحة.
الحل مع ESI:
لو تأملنا قليلا في المشكلة السابقة بالأعلى، مع الـcaching خمسة دقائق، سيتبين لنا أن المشكلة الحقيقية هي أن كل صفحة html هي عبارة عن single object. وكذالك فأي cache engine في المنتصف سيتعامل معه كقطعة واحدة، وهذا سيشمل عدم التمييز بين أجزائه: يعني إما يكون الـcache ttl خمسة دقائق للكل، أو لا يكون للكل. all or none.
الذي يفعله ESI، هو تقسيم كل صفحة html إلى عدة object منفصلة. وهكذا ممكن نقول للـreverse cache أن يقوم بـكاشينج لكل object ويعطيه ttl يتلائم معه. فالـهيدر سيكون object منفصل مع ttl=0، بينما المحتوى سيكون object آخر مع ttl=5min. وهذا التقسيم _فقط_ بين الخادم وبين الـReverse Cache server. زائر الصفحة لا يحس بشيء اطلاقا ويرى كل شيء كأنه صفحة html واحدة.
