در این مقاله می خواهیم به زبان ساده مفهوم کش وارنیش را بیان و نحوه کار آن را با هم بررسی کنیم.
وارنیش (Varnish) چیست؟
به زبان خیلی ساده، Varnish یک برنامه است که هم سرعت وبسایت را بالا میبرد و هم بار وبسرور را کم میکند. سایت رسمی Varnish، چنین تعریفی از آن ارائه میدهد: «ورنیش یک شتابدهنده (Accelerator) حرفهای وب سرور است که با نام HTTP Reverse Proxy هم شناخته میشود.»
اگر به کارهایی که وب سرور در مواقع غیرطبیعی انجام میدهد دقت کنید، میبینید که درخواستهای HTTP را گرفته و پاسخهایی از نوع HTTP به آنها میدهد. در حالت ایدهآل، وقتی وب سرور درخواستی را میگیرد بدون اینکه کار زمان بری انجام دهد، بلافاصله به آن پاسخ میدهد. اما در واقعیت، در اغلب موارد، وب سرور باید زمان قابل توجهی را صرف انجام درخواست کند و سپس پاسخ را برای مشتری ارسال کند. در ادامه، قصد داریم نحوه پاسخگویی یک وبسرور معمولی به درخواستها را برای شما شرح دهیم و پس از آن به شما نشان دهیم وارنیش چطور این وضعیت را بهبود میبخشد.
کش وارنیش چگونه کار میکند؟
ابزار اصلی تنظیمات وارنیش، زبان پیکربندی Varnish یا VCL است که یک زبان خاص دامنه (Domain-Specific Language) DSL است. از این زبان برای ساختن روال هایی که در زمان پاسخ اولیه به هر درخواست فراخوانی می شوند، استفاده می گردد. بیشتر تنظیمات، در کد VCL انجام می شود و به همین علت varnish را نسبت به اغلب عوامل دیگر تسریع کننده HTTP، قابل تنظیم تر و تطبیق پذیرتر می کند.
پارامترهای زمان اجرای متنوعی در Varnish، کنترل امور را در دست دارند. مثل حداکثر درجه و حداقل مقدار برای رشتههای laborer، تایماوت های مختلف و غیره.
یک رابط مدیریتی خط شارژ، به این پارامترها اجازه تغییر میدهد و اسکریپت های VCL جدید میتوانند بدون اجرای مجدد عامل تسریع کننده، سفارش داده، ایجاد و فعال شوند. به جهت کاهش تعداد فریمورکهایی که از مسیر سریع به حافظه آورده میشوند، اطلاعات لاگ در حافظه اشتراکی قرار میگیرند.
وظیفه کنترل، وارسی کردن، سازماندهی و تبدیل اطلاعات لاگ به یک صفحه بر عهده برنامه دیگری گذاشته شده است.
اگر چه هر سرور شرایط مخصوص به خود را دارد، اما یک وب سرور معمولی، مجموعه ای طولانی از اقدامات را برای پاسخ به هر درخواستی که دریافت میکند، انجام میدهد. این روند معمولا با ایجاد روال دیگری برای مدیریت درخواستها آغاز شود. در این مرحله، شاید نیاز باشد رکورد های اسکریپت از چرخه بارگذاری شده، یک روال واسط برای رمزگشایی فراخوانی شده و آن اسناد را به bytecode تبدیل کند.
سپس، وبسرور این bytecode را اجرا میکند، ممکن است اجرای این کد بار کاری بیشتری به همراه آورد. مثل اجرای کوئریهای سنگین SQL و بازیابی رکوردهای بیشتر از چرخه کار. حال تصور کنید این روند با صدها یا هزاران تقاضا، تکرار شود، الان بهتر میتوانید درک کنید که یک سرور چطور به یکباره دچار بار بیش از حد میشود و فریم ورک آن تلاش میکند تا به همه درخواستها پاسخ دهد.
بدتر از همه اینکه تعداد زیادی از درخواستها در واقع تکرار همان درخواستهای اولیه هستند، اما ممکن است سرور راهکاری برای فراخوانی مجدد پاسخ قبلی خود به این درخواست نداشته باشد. بنابراین، سرور باید همان فرآیند مشابه و پر زحمت قبل را بارها و بارها از قدم اول برای پاسخگویی به هر درخواست تکرار کند.
پارامترهایی که تاکنون در موردشان صحبت کردیم، همه توسط وارنیش قابل تنظیم هستند. مثلا میتوانیم انتخاب کنیم که یک درخواست توسط وارنیش بازیابی گردد، نه توسط وب سرور. سپس وارنیش نگاهی به آنچه مورد درخواست قرار گرفته می اندازد و درخواست را به سمت وب سرور میفرستد (که به عنوان یک سرور Backend برای وارنیش شناخته می شود). سرور Backend کار معمول و همیشگی خود را انجام می دهد و نتیجه را به وارنیش برمیگرداند، و در نهایت وارنیش هم نتیجه را به کاربر اولیهای که آن را درخواست کرده است تحویل میدهد.
به احتمال زیاد این همه کاری که از دست Varnish برمیآید نیست؛ چون تا اینجا که کمک زیادی به روند کار نکرد. چیزی که Varnish به این روند اضافه میکند این است که، Varnish قادر است پاسخ های سرور backend را ذخیره و برای استفاده در آینده رزرو کند. وارنیش سریعا میتواند از ذخیرههای خود استفاده کرده و به درخواستهای بعدی پاسخ دهد، بدون اینکه بار غیرضروری به وب سرور تحمیل کند.
✅ اگر کمی به این کمک بزرگ Varnish فکر کنیم به این نتیجه میرسیم که باعث کاهش انباشته شدن درخواستها می شود، زمان پاسخ را بهبود میبخشد و نهایتا درخواستهای بیشتری در هر ثانیه توسط سرور پاسخ داده میشوند.
چیزی که باعث سرعت فوقالعادۀ Varnish شده این است که پاسخهای رزرو خود را درون صفحه نگهداری نمیکند بلکه آنها را در حافظه نگه میدارد. این مورد به همراه پیشرفتهای دیگر به Varnish اجازه میدهد تا تقاضاها را با سرعت چشمگیری پردازش کند. با این اوصاف، چون معمولا حافظه از صفحه محدودتر است، باید میزان فضای مورد نیاز برای وارنیش خود را تخمین بزنید و اقداماتی انجام دهید تا درخواستهایی که باعث تلف شدن این فضای مفید میشوند در آن ذخیره نشوند.
Varnish جهت تنظیم بار هم از الگوریتم Round Robin و هم الگوریتمی اختیاری استفاده میکند. از هر دو برای تقسیم بار مناسب برای هر سرور backend استفاده میکند. علاوه براین، امکان بررسی سالم بودن سرور های backend هم وجود دارد.
موارد دیگری که Varnish آنها را پشتیبانی میکند کدامند؟
- پشتیبانی از ماژول ها با استفاده از ماژول های وارنیشی به نام VMOD.
- پشتیبانی از Edge Side Incorporate ها.
- پشتیبانی از فشرده سازی و از فشرده خارج کردن GZip .
- پشتیبانی از راهکاری های اجرایی مبتنی بر IP برای مشتری،هشینگ، نامنظم و ِ DNS.
- pass HTTP Gushing و get HTTP Gushing .
- پشتیبانی از تست Steady Stockpiling بدون تغییر URL.
- پشیبانی از مود های Saint و Grace.
چه کسانی بهتر است از Varnish استفاده کنند؟
همه میتوانند از وارنیش استفاده کنند؛ منتها این شتابدهنده بیشتر به درد کسبوکارهایی میخورد که باید سریع و مقیاسپذیر باشند و میخواهند از فشارهایی که به زیرساخت سرور وارد میشود، کم کنند.
مثلاً فروشگاههای اینترنتی بزرگ را در نظر بگیرید که چند صدم ثانیه تاخیر، باعث میشود مشتری را از دست بدهند. اینجور کسبوکارها حتماً باید از وارنیش استفاده کنند.
اگر سوال دیگری داشتید در بخش نظرات همین پست میتوانید بپرسید.
در این رابطه؛ ردیس (Redis) چیست؟
برگرفته از [interserver.net]