کش Varnish (ورنیش) چیست و چطور کار می کند؟
در این مقاله می خواهیم به زبان ساده مفهوم کش وارنیش را بیان و نحوه کار آن را با هم بررسی کنیم. Varnish یک برنامه است که هم سرعت وب سایت را بالا می برد و هم بار وب سرور را کم می کند. سایت رسمی Varnish، چنین تعریفی از آن ارائه می دهد: “ورنیش یک شتاب دهنده حرفه ای وب سرور است که با نام HTTP Reverse Proxy هم شناخته می شود.”
اگر به کارهایی که وب سرور در مواقع غیرطبیعی انجام می دهد دقت کنید، می بینید که درخواست های HTTP را گرفته و پاسخ هایی از نوع HTTP به آنها می دهد. در حالت ایده آل، وقتی وب سرور درخواستی را می گیرد بدون اینکه کار زمان بری انجام دهد، بلافاصله به آن پاسخ می دهد. اما در واقعیت، در اغلب موارد، وب سرور باید زمان قابل توجهی را صرف انجام درخواست کند و سپس پاسخ را برای مشتری ارسال کند. در این مقاله، قصد داریم نحوه پاسخگویی یک وب سرور معمولی به درخواست ها را برای شما شرح دهیم و پس از آن به شما نشان دهیم Varnish چطور این وضعیت را بهبود می بخشد.
ابزار اصلی تنظیمات وارنیش، زبان پیکربندی 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.