در این مقاله ما میخواهیم نحوه نصب/تنظیمات وارنیش کش (Varnish Cache) به همراه تنظیمات آن روی وب سرورهای Apache و Nginx را در Debian/Ubuntu و CentOS/RedHat به شما توضیح دهیم. آیا تا به حال فکر کرده اید که زمانیکه شما به این صفحه وارد میشوید چه اتفاقی می افتد. یا زمانیکه شما روی لینکی که از طریق یک خبرنامه و یا لینکی از صفحه خانگی منطقه لینوکسی ها کلیک میکنید و به این مقاله وارد میشوید چه اتفاقی در پشت صحنه روی میدهد.
به عبارت ساده، شما (یا در واقع مرورگرتان) یک درخواست HTTP (یا http request) به سمت وب سروری که این سایت روی آن میباشد ارسال میکند، و وب سرور یک پاسخ HTTP (یا http response) را بر میگرداند.
ساده به نظر میرسد، اما این مرحله شامل مراحل بیشمار دیگری نیز میباشد. به منظور ارائه صفحه ای که به درستی و تمام کمال طراحی شده به طوریکه شما بتوانید تمامی منابع درون آنرا مشاهده کنید پردازش های زیادی باید سمت سرور صورت پذیرد. شما میتوانید فرض کنید که اگر وب سرور بخواهد به درخواست های زیادی شبیه به این و به صورت همزمان پاسخ دهد میتواند خودش یا کل سیستم را به مدت طولانی در اختیار crawl ها قرار دهد.
و این جایی است که Varnish (یک توسعه دهنده ی با عملکرد بالا برای HTTP و reverse proxy) میتواند تا حد بالایی کار شما را آسان کند. در این پست ما به شما نحوه نصب و استفاده از وارنیش به عنوان یک front-end برای آپاچی یا انجین ایکس به منظور کش کردن سریعتر درخواست های HTTP بدون لود اضافی روی وب سرور، را آموزش خواهیم داد.
به هر حال، از آنجایی که وارنیش به صورت نرمال کش خود را در مموری (به جای ذخیره روی دیسک) ذخیره میکند ما نیاز خواهیم داشت که با دقت باشیم و فضای RAM موجود برای cache را محدود کنیم. درباره نحوه انجام دادن آن بحث خواهیم کرد.
کلاینت ها درخواست های HTTP خود را به آنچه که آنها با عنوان یک سرویس وب سرور منظم میبینند، ارسال میکنند اما در حقیقت آنچه که این درخواست ها را دریافت میکند Varnish میباشد. وارنیش در عوض درخواست ها را به Apache یا Nginx ارجاع میدهد و پاسخ ها را در cashe خود ذخیره میکند به طوریکه درخواست های بعدی به جای اینکه از طریق عملیات پردازش دیگری در وب سرور پاسخ داده شوند مستقیما از کش وارنیش فراخونی میشوند. این موضوع زمان پاسخ را سرعت بخشیده و پردازش لود در خود وب سرور را کاهش میدهد.
نصب Varnish
در این پست ما فرض میکنیم که شما یک سرور LAMP یا LEMP نصب شده آماده دارید. در غیر اینصورت لطفا یکی از آنها را با استفاده از پست های زیر قبل از ادامه کار نصب کنید.
داکیومنت های رسمی به شما پیشنهاد میکنند که وارنیش را از طریق ریپازیتوری توسعه دهنده آن نصب کنید به این دلیل که آنها همیشه آخرین ورژن ها را ارائه میدهند. شما همچنین میتوانید انتخاب کنید که پکیج را از ریپازیتوری های رسمی توزیع لینوکس خود (اگر چه کمی قدیمی باشد) نصب کنید.
همچنین لطفا توجه کنید که ریپازیتوری های مورد نظر تنها از سیستم های 64 بیتی پشتیبانی میکنند در حالیکه برای سیستم های 32 بیتی شما باید از ریپازیتوری های رسمی توزیع مورد نظر خود استفاده کنید.
در این پست ما Varnish را از طریق ریپازیتوری های رسمی که توسط هر توزیع پشتیبانی میشوند نصب خواهیم کرد. هدف اصلی پشت این تصمیم در حقیقت ایجاد یکپارچگی در روش نصب و اطمینان از برطرف کردن اتوماتیک مشکلات dependency (پیش نیاز) برای تمام معماری های سیستمی میباشد.
روی Debian و Ubuntu
روی RedHat, CentOS و Fedora
برای centos و redhat شما نیاز خواهید داشت که قبل از نصب Varnish ریپازیتوری EPEL را فعال کنید.
اگر نصب با موفقیت کامل شود شما یکی از ورژن های زیر را با توجه به توزیع لینوکسی تان خواهید داشت.
در نهایت، اگر پروسه نصب خودش Varnish را start نکرد شما نیاز دارید که به صورت دستی آنرا start کنید، و همچنین start اتوماتیک آنرا به هنگام Boot فعال کنید.
روی Debian, Ubuntu, CentOS/RHEL 6.x و Fedora 15-20
روی CentOS/RHEL 7.x و Fedora 21
تنظیمات Varnish
برای کار با Varnish شما نیاز خواهید داشت که با دو فایل کانفیگ آشنا شوید.
1 - پارامترهای فایل تنظیمات Varnish :
2 - فایل تنظیمات VCL (زبان تنظیمات وارنیش / Varnish Configuration Language) فایل /etc/varnish/default.vcl
فایل اول یک فایل کانفیگ محیطی است که شامل تمام اطلاعات مورد نیاز برای وارنیش است تا به درستی کار کند، در حالیکه فایل دوم به شما امکان تعریف پالیسی های caching تان را فراهم میآورد.
از آنجایی که شما در این پست با ورژن هایی متفاوتی از وارنیش روبه رو هستید ما تنظیمات مشترک را مشخص خواهیم کرد و برای اطلاعات بیشتر به داکیومنت های هر ورژن (3.0 و 4.0) مراجعه نمایید.
همانطور که قبلا گفتیم Varnish بین Client ها و Web Server قرار میگیرد. به همین دلیل و به منظور اینکه عملیات کش برای کاربران نهایی شفاف شود ما نیاز خواهیم داشت :
1 - Port پیش فرض را که Varnish به آن گوش میدهد را به 80 تغییر دهیم.
2 - Port پیش فرض را که وب سرور به آن گوش میدهد را به 8080 (به جای پورت پیش فرض 80) تغییر میدهیم.
3 - و در آخر ترافیک های ورودی از وارنیش را به وب سرور redirect میکنیم. خوشبختانه وارنیش این مورد را بعد از اینکه ما مراحل 1 و 2 را انجام دادیم خودش به صورت اتوماتیک انجام میدهد.
جدول زیر فایل های تنظیمات و تغییراتی که ما باید به ازای هر ورژن باید ایجاد کنیم را لیست میکند.
تمام این تنظیمات در فایل های کانفیگ به صورت کامل توضیح داده شده اند. به هر حال، فکر میکنم ضرری ندارد که آنرا توضیح دهیم.
که به این معنی است که به منظور کش کردن 512MB از بلاک مموری را اشغال خواهد کرد. شما میتوانید میزان مموری را با توجه به ریسورس های سخت افزاری تان تغییر دهید و یا انتخاب کنید که فایل های کش شده را در دیسک ذخیره کند.
مورد دوم (که در اینجا توضیح نخواهیم داد) اینکه شما میتوانید تنها از خط پیش فرض VARNISH_STORAGE استفاده کنید که به صورت پیش فرض در فایل کانفیگ موجود است.
اکنون فایل کانفیگ وب سرور را ویرایش میکنیم.
بعد از تغییرات بالا فراموش نکنید Varnish و webserver را restart کنید.
تست Varnish
اولین تست ایجاد یک درخواست HTTP از طریق curl و بررسی چیزی است که از طریق وارنیش کنترل میشود.
وارنیش همچنین شامل دو ابزار ساده نیز میباشد :
به عنوان تست بعدی که در تصویر بعد مشاهده میکنید ما هم log و هم آمار وارنیش را روی سرور CentOS 7 (در حقیقت dev1 در نیمه بالایی تصویر) و روی یک سرور Debian 7.5 (در حقیقت dev2 در نیمه پایینی تصویر) هنگامیکه درخواست های HTTP ارسال و پاسخ ها دریافت میشوند نمایش خواهیم داد.
سومین و آخرین تست ما شامل آنالیز و تحلیل وب سرور و وارنیش با ابزار ab و همچنین مقایسه زمان response و لود CPU در هر مورد میباشد. در این مثال ما از سرور CentOS 7.0 استفاده خواهیم کرد اما شما میتوانید هر توزیع دیگری را استفاده کنید و نتایج مشابهی به دست آورید. میانگین لود (load avarage) را در بالای خروجی و request ها در خط دوم خروجی ab مشاهده نمایید.
با استفاده از ab، ما 50 درخواست همزمان در یک لحظه (با استفاده از آپشن -c 50) را ارسال خواهیم کرد و تست را 1000000 بار تکرار میکنیم. (با استفاده از -n 1000000). وارنیش یک تعداد بالاتری از درخواست ها را در ثانیه ارسال میکند و میانگین لود بسیار پایین تری را مصرف میکند.
نکته : لطفا به خاطر داشته باشید که وارنیش روی پورت 80 (پورت پیش فرض HTTP) در حال listen کردن است در حالیکه Apache روی پورت 8080 لیسن میکند. همچنین به میزان زمان مورد نیاز برای تکمیل هر تست دقت کنید.
نتیجه:
در این مقاله ما درمورد نحوه ی راه اندازی کشینگ وارنیش در مقابل یک وب سرور (آپاچی یا انجینکس) صحبت کردیم.توجه کنید که ما عمیقا روی فایل کانفیگ default.vcl بحث نکردیم که برای ما امکان تغییرات دلخواه روی پالیسی های caching را فراهم میاورد.
برای مثالهای بیشتر پیشنهاد میکنیم که به داکیومنتهای رسمی مراجعه نمایید.(لینکهایی که در ابتدای این مقاله جایی که فایلهای کانفیگ وارنیش را لیست کردیم مشاهده نمایید )
به عبارت ساده، شما (یا در واقع مرورگرتان) یک درخواست HTTP (یا http request) به سمت وب سروری که این سایت روی آن میباشد ارسال میکند، و وب سرور یک پاسخ HTTP (یا http response) را بر میگرداند.
ساده به نظر میرسد، اما این مرحله شامل مراحل بیشمار دیگری نیز میباشد. به منظور ارائه صفحه ای که به درستی و تمام کمال طراحی شده به طوریکه شما بتوانید تمامی منابع درون آنرا مشاهده کنید پردازش های زیادی باید سمت سرور صورت پذیرد. شما میتوانید فرض کنید که اگر وب سرور بخواهد به درخواست های زیادی شبیه به این و به صورت همزمان پاسخ دهد میتواند خودش یا کل سیستم را به مدت طولانی در اختیار crawl ها قرار دهد.
و این جایی است که Varnish (یک توسعه دهنده ی با عملکرد بالا برای HTTP و reverse proxy) میتواند تا حد بالایی کار شما را آسان کند. در این پست ما به شما نحوه نصب و استفاده از وارنیش به عنوان یک front-end برای آپاچی یا انجین ایکس به منظور کش کردن سریعتر درخواست های HTTP بدون لود اضافی روی وب سرور، را آموزش خواهیم داد.
به هر حال، از آنجایی که وارنیش به صورت نرمال کش خود را در مموری (به جای ذخیره روی دیسک) ذخیره میکند ما نیاز خواهیم داشت که با دقت باشیم و فضای RAM موجود برای cache را محدود کنیم. درباره نحوه انجام دادن آن بحث خواهیم کرد.
کلاینت ها درخواست های HTTP خود را به آنچه که آنها با عنوان یک سرویس وب سرور منظم میبینند، ارسال میکنند اما در حقیقت آنچه که این درخواست ها را دریافت میکند Varnish میباشد. وارنیش در عوض درخواست ها را به Apache یا Nginx ارجاع میدهد و پاسخ ها را در cashe خود ذخیره میکند به طوریکه درخواست های بعدی به جای اینکه از طریق عملیات پردازش دیگری در وب سرور پاسخ داده شوند مستقیما از کش وارنیش فراخونی میشوند. این موضوع زمان پاسخ را سرعت بخشیده و پردازش لود در خود وب سرور را کاهش میدهد.
نصب Varnish
در این پست ما فرض میکنیم که شما یک سرور LAMP یا LEMP نصب شده آماده دارید. در غیر اینصورت لطفا یکی از آنها را با استفاده از پست های زیر قبل از ادامه کار نصب کنید.
داکیومنت های رسمی به شما پیشنهاد میکنند که وارنیش را از طریق ریپازیتوری توسعه دهنده آن نصب کنید به این دلیل که آنها همیشه آخرین ورژن ها را ارائه میدهند. شما همچنین میتوانید انتخاب کنید که پکیج را از ریپازیتوری های رسمی توزیع لینوکس خود (اگر چه کمی قدیمی باشد) نصب کنید.
همچنین لطفا توجه کنید که ریپازیتوری های مورد نظر تنها از سیستم های 64 بیتی پشتیبانی میکنند در حالیکه برای سیستم های 32 بیتی شما باید از ریپازیتوری های رسمی توزیع مورد نظر خود استفاده کنید.
در این پست ما Varnish را از طریق ریپازیتوری های رسمی که توسط هر توزیع پشتیبانی میشوند نصب خواهیم کرد. هدف اصلی پشت این تصمیم در حقیقت ایجاد یکپارچگی در روش نصب و اطمینان از برطرف کردن اتوماتیک مشکلات dependency (پیش نیاز) برای تمام معماری های سیستمی میباشد.
روی Debian و Ubuntu
کد PHP:
# aptitude update && aptitude install varnish [بهتر است دستورات را با sudo اجرا کنید.]
روی RedHat, CentOS و Fedora
برای centos و redhat شما نیاز خواهید داشت که قبل از نصب Varnish ریپازیتوری EPEL را فعال کنید.
کد PHP:
# yum update && yum install varnish
اگر نصب با موفقیت کامل شود شما یکی از ورژن های زیر را با توجه به توزیع لینوکسی تان خواهید داشت.
- Debian: 3.0.2-2+deb7u1
- Ubuntu: 3.0.2-1
- Fedora, CentOS, و RHEL ورژن 4.0.2 (وارنیش در این ورژن همانند بالا در ریپازیتوری EPEL فعال میباشد.)
در نهایت، اگر پروسه نصب خودش Varnish را start نکرد شما نیاز دارید که به صورت دستی آنرا start کنید، و همچنین start اتوماتیک آنرا به هنگام Boot فعال کنید.
روی Debian, Ubuntu, CentOS/RHEL 6.x و Fedora 15-20
کد PHP:
# service varnish start
# service varnish status
# chkconfig --level 345 varnish on
روی CentOS/RHEL 7.x و Fedora 21
کد PHP:
# systemctl start varnish
# systemctl status varnish
# system enable varnish
تنظیمات Varnish
برای کار با Varnish شما نیاز خواهید داشت که با دو فایل کانفیگ آشنا شوید.
1 - پارامترهای فایل تنظیمات Varnish :
- /etc/sysconfig/varnish (در RHEL/CentOS 6.x/Fedora machines) یا /etc/default/varnish (در سیستم های Debian و Ubuntu (Varnish ورژن 3.0)
- /etc/varnish/varnish.params در سیستم های RHEL/CentOS 7 و Fedora 21 (Varnish ورژن 4.0)
2 - فایل تنظیمات VCL (زبان تنظیمات وارنیش / Varnish Configuration Language) فایل /etc/varnish/default.vcl
فایل اول یک فایل کانفیگ محیطی است که شامل تمام اطلاعات مورد نیاز برای وارنیش است تا به درستی کار کند، در حالیکه فایل دوم به شما امکان تعریف پالیسی های caching تان را فراهم میآورد.
از آنجایی که شما در این پست با ورژن هایی متفاوتی از وارنیش روبه رو هستید ما تنظیمات مشترک را مشخص خواهیم کرد و برای اطلاعات بیشتر به داکیومنت های هر ورژن (3.0 و 4.0) مراجعه نمایید.
همانطور که قبلا گفتیم Varnish بین Client ها و Web Server قرار میگیرد. به همین دلیل و به منظور اینکه عملیات کش برای کاربران نهایی شفاف شود ما نیاز خواهیم داشت :
1 - Port پیش فرض را که Varnish به آن گوش میدهد را به 80 تغییر دهیم.
2 - Port پیش فرض را که وب سرور به آن گوش میدهد را به 8080 (به جای پورت پیش فرض 80) تغییر میدهیم.
3 - و در آخر ترافیک های ورودی از وارنیش را به وب سرور redirect میکنیم. خوشبختانه وارنیش این مورد را بعد از اینکه ما مراحل 1 و 2 را انجام دادیم خودش به صورت اتوماتیک انجام میدهد.
جدول زیر فایل های تنظیمات و تغییراتی که ما باید به ازای هر ورژن باید ایجاد کنیم را لیست میکند.
تمام این تنظیمات در فایل های کانفیگ به صورت کامل توضیح داده شده اند. به هر حال، فکر میکنم ضرری ندارد که آنرا توضیح دهیم.
کد PHP:
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}"
or
VARNISH_STORAGE="malloc,512M"
مورد دوم (که در اینجا توضیح نخواهیم داد) اینکه شما میتوانید تنها از خط پیش فرض VARNISH_STORAGE استفاده کنید که به صورت پیش فرض در فایل کانفیگ موجود است.
اکنون فایل کانفیگ وب سرور را ویرایش میکنیم.
بعد از تغییرات بالا فراموش نکنید Varnish و webserver را restart کنید.
تست Varnish
اولین تست ایجاد یک درخواست HTTP از طریق curl و بررسی چیزی است که از طریق وارنیش کنترل میشود.
کد PHP:
# curl -I http://localhost
[APARAT]EpwVf[/APARAT]
وارنیش همچنین شامل دو ابزار ساده نیز میباشد :
- نمایش log های Varnish به صورت real time که varnishlog نامیده میشود.
- نمایش آمار کش Varnish که varnishstat نامیده میشود.
به عنوان تست بعدی که در تصویر بعد مشاهده میکنید ما هم log و هم آمار وارنیش را روی سرور CentOS 7 (در حقیقت dev1 در نیمه بالایی تصویر) و روی یک سرور Debian 7.5 (در حقیقت dev2 در نیمه پایینی تصویر) هنگامیکه درخواست های HTTP ارسال و پاسخ ها دریافت میشوند نمایش خواهیم داد.
سومین و آخرین تست ما شامل آنالیز و تحلیل وب سرور و وارنیش با ابزار ab و همچنین مقایسه زمان response و لود CPU در هر مورد میباشد. در این مثال ما از سرور CentOS 7.0 استفاده خواهیم کرد اما شما میتوانید هر توزیع دیگری را استفاده کنید و نتایج مشابهی به دست آورید. میانگین لود (load avarage) را در بالای خروجی و request ها در خط دوم خروجی ab مشاهده نمایید.
با استفاده از ab، ما 50 درخواست همزمان در یک لحظه (با استفاده از آپشن -c 50) را ارسال خواهیم کرد و تست را 1000000 بار تکرار میکنیم. (با استفاده از -n 1000000). وارنیش یک تعداد بالاتری از درخواست ها را در ثانیه ارسال میکند و میانگین لود بسیار پایین تری را مصرف میکند.
نکته : لطفا به خاطر داشته باشید که وارنیش روی پورت 80 (پورت پیش فرض HTTP) در حال listen کردن است در حالیکه Apache روی پورت 8080 لیسن میکند. همچنین به میزان زمان مورد نیاز برای تکمیل هر تست دقت کنید.
کد PHP:
# ab -c 50 -n 100000 http://localhost/index.html
[APARAT]RXhdm[/APARAT]
نتیجه:
در این مقاله ما درمورد نحوه ی راه اندازی کشینگ وارنیش در مقابل یک وب سرور (آپاچی یا انجینکس) صحبت کردیم.توجه کنید که ما عمیقا روی فایل کانفیگ default.vcl بحث نکردیم که برای ما امکان تغییرات دلخواه روی پالیسی های caching را فراهم میاورد.
برای مثالهای بیشتر پیشنهاد میکنیم که به داکیومنتهای رسمی مراجعه نمایید.(لینکهایی که در ابتدای این مقاله جایی که فایلهای کانفیگ وارنیش را لیست کردیم مشاهده نمایید )
کامنت