SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
‫خدا‬ ‫نام‬ ‫به‬
varnish
‫دخت‬ ‫اسمعیل‬ ‫یاشار‬ : ‫نویسنده‬
‫نسخه‬
۰.۱
: ‫نویسنده‬ ‫باره‬ ‫در‬
‫رشته‬ ‫آموخته‬ ‫دانش‬ ‫دخت‬ ‫اسمعیل‬ ‫یاشار‬ ‫بنده‬
cyber security
. ‫هستم‬
‫از‬ ‫بیش‬
۱۵
. ‫دارم‬ ‫فعالیت‬ ‫سابقه‬ ‫سال‬
‫مولف‬ - ‫مدرس‬ - ‫مشاور‬ : ‫داد‬ ‫شرح‬ ‫زیر‬ ‫های‬ ‫ساختار‬ ‫در‬ ‫میتوان‬ ‫را‬ ‫بنده‬ ‫های‬ ‫فعالیت‬ ‫جمله‬ ‫از‬
gnu/linux system/network/security Engineer/administrator & oracle dba | Linux Trainer |devops
. ): ‫جدید‬ ‫دنیاهای‬ ‫کشف‬ ‫و‬ ‫تحقیق‬ ‫و‬ ‫مطالعه‬ ‫به‬ ‫مند‬ ‫عالقه‬
. ‫کنم‬ ‫اشاره‬ ‫استراتژی‬ ‫های‬ ‫بازی‬ ‫و‬ ‫اوتلو‬ ‫و‬ ‫شطرنج‬ ‫بازی‬ ‫به‬ ‫میتوانم‬ ‫من‬ ‫های‬ ‫سرگرمی‬ ‫از‬ ‫واقع‬ ‫در‬
‫بنیان‬ ‫از‬ ‫یکی‬ ‫و‬ ‫لینوکس‬/‫گنو‬ ‫و‬ ‫باز‬ ‫متن‬ ‫دنیای‬ ‫عاشق‬ . ‫هستم‬ ‫عاشق‬ ‫یک‬ ‫من‬
‫گذ‬
‫تبریز‬ ‫الگ‬ ‫اران‬
: ‫کنید‬ ‫پیدا‬ ‫و‬ ‫کنید‬ ‫دنبال‬ ‫را‬ ‫من‬ ‫میتوانید‬ ‫چطور‬ ‫خب‬
Mob : 09141100257
Telegram ID
Telegram channel
Instagram Account
Linkedin Account
. ‫بشنوم‬ ‫را‬ ‫انتقادتون‬ ‫یا‬ ‫پیشنهاد‬ ‫هرگونه‬ ‫میشم‬ ‫خوشحال‬ ‫همچنین‬
‫چ‬
: ‫کنید‬ ‫پیدا‬ ‫را‬ ‫من‬ ‫از‬ ‫ی‬ ‫دیگر‬ ‫های‬ ‫کتاب‬ ‫میتونید‬ ‫طور‬
‫توی‬
slideshare
. ‫کنید‬ ‫پیدا‬ ‫را‬ ‫کردم‬ ‫منتشر‬ ‫آزاد‬ ‫بصورت‬ ‫که‬ ‫دیگری‬ ‫های‬ ‫کتاب‬ ‫میتونید‬ ‫بگردید‬ ‫من‬ ‫اسم‬ ‫دنبال‬ ‫گوگل‬ ‫یا‬
‫؟‬ ‫کیست‬ ‫ی‬ ‫برا‬ ‫کتاب‬ ‫این‬
‫برای‬ ‫کتاب‬ ‫این‬
sys admin
‫و‬
sys enginner
‫و‬ ‫شده‬ ‫تهیه‬ ‫ها‬
‫الیه‬ ‫شبکه‬ ‫های‬ ‫پروتکل‬ ‫از‬ ‫درستی‬ ‫درک‬ ‫که‬ ‫کسانی‬
۷
. ‫دارند‬
‫شرح‬ ‫و‬ ‫تعریف‬ ‫از‬ ‫قسمتی‬ : ‫نکته‬
varnish
‫شده‬ ‫برداشت‬ ‫اینترنت‬ ‫از‬
. ‫است‬
( ‫وارنیش‬
Varnish
‫استفاده‬ ‫مورد‬ ‫امنیتی‬ ‫سیستم‬ ‫یک‬ ‫بصورت‬ ‫هم‬ ‫کشینگ‬ ‫بصورت‬ ‫هم‬ ‫وارنیش‬.‫است‬ ‫سرور‬ ‫وب‬ ‫برای‬ ‫کشینگ‬ ‫سیستم‬ ‫یک‬ )
‫سیستم‬ ‫یک‬ ‫خود‬ ‫در‬ ‫یعنی‬ .‫میگیرد‬ ‫قرار‬
waf
. ‫میباشد‬ ‫وب‬ ‫شتابدهنده‬ ‫یک‬ ‫همچنین‬ . ‫دارد‬ ‫قدرتمند‬
‫در‬ ‫که‬ ‫است‬ ‫بصورتی‬ ‫آن‬ ‫عملکرد‬ ‫سیستم‬
 
.‫میشود‬ ‫هاست‬ ‫روی‬ ‫سایت‬ ‫وب‬ ‫سرعت‬ ‫افزایش‬ ‫باعث‬ ‫و‬ ‫میگیرد‬ ‫قرار‬ ‫سرور‬ ‫وب‬ ‫مقابل‬
(‫وارنیش‬
Varnish
‫؟‬ ‫میکند‬ ‫کار‬ ‫چگونه‬ )
‫ارسال‬ ‫درخواستهای‬ ‫به‬ ‫سرعت‬ ‫به‬ ‫و‬ ‫میکند‬ ‫زخیره‬ ‫هاست‬ ‫سرور‬ ‫حافظه‬ ‫روی‬ ‫را‬ ‫شما‬ ‫سایت‬ ‫وب‬ ‫استاتیک‬ ‫اطالعات‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬
.‫میدهد‬ ‫پاسخ‬ ‫کاربران‬ ‫سمت‬ ‫از‬ ‫شده‬
‫پردازش‬ ‫کاهش‬ ‫سیستم‬ ‫این‬ ‫دیگر‬ ‫مزیت‬
CPU
‫میزان‬ ‫آمدن‬ ‫پایین‬ ‫و‬
CPU Usage
‫دیتابیس‬ ‫از‬ ‫اطالعاتی‬ ‫و‬ ‫ها‬ ‫فایل‬ ‫نمایش‬ ‫سرعت‬ ‫افزایش‬ ،
.‫شود‬ ‫داده‬ ‫نمایش‬ ‫و‬ ‫استخراج‬ ‫آنها‬ ‫اطالعات‬ ‫آنی‬ ‫و‬ ‫ای‬ ‫لحظه‬ ‫بصورت‬ ‫نیست‬ ‫الزم‬ ‫که‬ ‫است‬
(‫وارنیش‬ ‫کشینگ‬ ‫با‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫عملکرد‬
Varnish
)
‫با‬ ‫و‬ ‫است‬ ‫اصلی‬ ‫سرور‬ ‫روی‬ ‫تغییر‬ ‫بدون‬ ‫و‬ ‫تکراری‬ ‫بصورت‬ ‫ها‬ ‫درخواست‬ ‫این‬ ‫که‬ ‫دارد‬ ‫وجود‬ ‫هایی‬ ‫درخواست‬ ‫همیشه‬ ‫سرورها‬ ‫وب‬ ‫روی‬ ‫در‬
.‫یابد‬ ‫می‬ ‫کاهش‬ ‫شدت‬ ‫به‬ ‫سرور‬ ‫منابع‬ ‫از‬ ‫استفاده‬ ‫و‬ ‫افزایش‬ ‫پاسخگویی‬ ‫سرعت‬ ‫کشینگ‬ ‫سیستم‬ ‫طریق‬ ‫از‬ ‫ها‬ ‫نیاز‬ ‫این‬ ‫به‬ ‫پاسخگویی‬
: ‫است‬ ‫شده‬ ‫داده‬ ‫نشان‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫با‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬ ‫عملکرد‬ ‫دیاگرام‬ ‫زیر‬ ‫تصویر‬ ‫در‬
(‫وارنیش‬ ‫کشینگ‬ ‫بدون‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫عملکرد‬
Varnish
)
‫با‬ ‫نهایت‬ ‫در‬ ‫و‬ ‫پی‬ ‫اچ‬ ‫پی‬ ‫با‬ ‫ارتباط‬ ‫زیادی‬ ‫تعداد‬ ‫وارنیش‬ ‫کشینگ‬ ‫از‬ ‫استفاده‬ ‫بدون‬ ‫سرور‬ ‫وب‬ ‫میکنید‬ ‫مشاهده‬ ‫زیر‬ ‫تصویر‬ ‫در‬ ‫که‬ ‫همانطوری‬
(‫ال‬ ‫کیو‬ ‫اس‬ ‫مای‬ ‫دیتابیس‬
mysql
‫مانند‬ ‫سرور‬ ‫منابع‬ ‫از‬ ‫الزم‬ ‫غیر‬ ‫استفاده‬ ‫و‬ ‫شدن‬ ‫کند‬ ‫باعث‬ ‫که‬ ‫میشود‬ ‫برقرار‬ )
CPU
.‫میشود‬
.‫میدهد‬ ‫نمایش‬ ‫را‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬ ‫بدون‬ ‫آپاچی‬ ‫عملکرد‬ ‫نحوه‬ ‫زیر‬ ‫دیاگرام‬
‫سیستم‬ ‫در‬
Varnish Cache
‫ارسال‬ ‫امکان‬
http header
‫دارد‬ ‫وجود‬ ‫بازدیدکننده‬ ‫کامپیوتر‬ ‫یا‬ ‫نویسی‬ ‫برنامه‬ ‫اسکریپت‬ ‫به‬
‫به‬ ‫موسوم‬ ‫جاوا‬ ‫نویسی‬ ‫برنامه‬ ‫زبان‬ ‫طریق‬ ‫از‬ ‫موضوع‬ ‫این‬ ‫که‬
VCL
.‫است‬ ‫پذیر‬ ‫امکان‬
‫کش‬ ‫وارنیش‬
varnish cache
‫دهنده‬ ‫شتاب‬ ‫یک‬
HTTP
‫و‬
https
. ‫میباشد‬
‫های‬ ‫سایت‬ ‫وب‬ ‫برای‬ ‫شده‬ ‫طراحی‬ ‫که‬
.‫باال‬ ‫بسیار‬ ‫بازدید‬ ‫با‬ ‫داینامیک‬
Varnish
‫مثل‬ ‫دیگری‬ ‫های‬ ‫سرور‬ ‫کش‬ ‫خالف‬ ‫بر‬
Squid
‫برای‬ ‫که‬
HTTP
‫و‬
SMTP
‫و‬
FTP
‫طور‬ ‫به‬ .‫شود‬ ‫می‬ ‫کاربرده‬ ‫به‬
‫روی‬ ‫بر‬ ‫تخصصی‬
HTTP
.‫است‬ ‫شده‬ ‫متمرکز‬
‫مجوز‬ ‫دو‬ ‫تحت‬ ،‫است‬ ‫باز‬ ‫منبع‬ ‫وارنیش‬
BSD
‫نسخه‬ .‫است‬ ‫شده‬ ‫منتشر‬
1.0
‫سال‬ ‫در‬ ‫وارنیش‬ ‫از‬
2006
‫وارنیش‬ .‫شد‬ ‫منتشر‬
2.0
‫سال‬ ‫در‬
2008
‫وارنیش‬ ‫و‬ ،‫شد‬ ‫منتشر‬
3.0
‫سال‬ ‫در‬
2011
.‫شد‬ ‫منتشر‬
‫پروژه‬
 
‫وارنیش‬
 
‫زبان‬ ‫به‬ .‫است‬ ‫شده‬ ‫آغاز‬ ‫نروژی‬ ‫آنالین‬ ‫روزنامه‬ ‫یک‬ ‫توسط‬
C
‫های‬ ‫عامل‬ ‫سیستم‬ ‫برای‬ ‫و‬ ‫است‬ ‫نوشته‬
..‫دارد‬ ‫را‬ ‫معروف‬ ‫های‬ ‫عامل‬ ‫سیستم‬ ‫همه‬ ‫روی‬ ‫بر‬ ‫نصب‬ ‫قابلیت‬ ‫وارنیش‬ ‫که‬ ‫بگم‬ ‫باید‬ ‫البته‬ ‫است‬ ‫شده‬ ‫طراحی‬ ‫یونیکس‬
‫توسط‬
 
Poul-Henning Kamp
.‫شود‬ ‫می‬ ‫داده‬ ‫توسعه‬ ,
‫در‬ ‫اطالعات‬
 
‫و‬ ‫رم‬ ‫حافظه‬ ‫در‬ ‫اطالعاتی‬ ‫چه‬ ‫که‬ ‫گیرد‬ ‫می‬ ‫تصمیم‬ ‫سپس‬ ‫و‬.‫شود‬ ‫می‬ ‫ذخیره‬ ‫سیستم‬ ‫رم‬ ‫حافظه‬ ‫در‬ ‫وارنیش‬
.‫کند‬ ‫پیدا‬ ‫انتقال‬ ‫سیستم‬ ‫هارد‬ ‫به‬ ‫اطالعتی‬ ‫چه‬
‫همپچنین‬ ‫برسدو‬ ‫کانکشن‬ ‫تعداد‬ ‫محدودیت‬ ‫به‬ ‫که‬ ‫وقتی‬ ‫تا‬ ‫دهد‬ ‫می‬ ‫اختصاص‬ ‫جداگانه‬ ‫ترد‬ ‫بک‬ ‫اتصال‬ ‫هر‬ ‫با‬ ‫وارنیش‬
‫قرار‬ ‫ریز‬ ‫سر‬ ‫صف‬ ‫در‬ ‫را‬ ‫جدید‬ ‫ورودی‬ ‫های‬ ‫درخواست‬
‫ک‬.‫دهد‬ ‫می‬
‫وارنیش‬
 
‫پسوند‬ ‫با‬ ‫فایلی‬ ‫ساختار‬ ‫از‬ ‫خود‬ ‫پیکربندی‬ ‫برای‬
VCL
‫که‬ ‫کند‬ ‫می‬ ‫استفاده‬
 
‫زبان‬ ‫وسیله‬ ‫به‬
C
‫نویسی‬ ‫اسکریپت‬
‫شود‬ ‫می‬ ‫انجام‬ ‫برایش‬
Varnish
‫از‬ ‫همچنین‬
 
 
load balancing
 
‫و‬
‫الگوریتم‬
 
round robin
 
.‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫خوبی‬ ‫به‬
 
.
‫برای‬ ‫ها‬ ‫پالگین‬ ‫نوشتن‬ ‫قابلیت‬
 
‫وارنیش‬
 
‫ماژول‬ ‫از‬ ‫استفاده‬ ‫یا‬ ‫و‬ ‫نوشتن‬ ‫با‬ ‫شما‬ ‫که‬ ‫هست‬ ‫ان‬ ‫خوب‬ ‫بسیار‬ ‫مزایای‬ ‫جمله‬ ‫از‬
‫به‬ ‫توانم‬ ‫می‬ ‫معروف‬ ‫های‬ ‫ماژول‬ ‫جمله‬ ‫از‬ ‫بدهید‬ ‫جواب‬ ‫خود‬ ‫نیازهای‬ ‫از‬ ‫خیلی‬ ‫به‬ ‫تونید‬ ‫می‬ ‫وارنیش‬ ‫برای‬ ‫شده‬ ‫نوشته‬ ‫های‬
Vanirsh security
.‫ببرم‬ ‫نام‬ ‫را‬
 
‫از‬ ‫پشیبانی‬
 
ESI
‫سازی‬ ‫فشرده‬
GZIP
‫آن‬ ‫استخراج‬ ‫و‬
‫دیگر‬ ‫بسیار‬ ‫های‬ ‫قابلیت‬ ‫و‬
‫از‬ ‫استفاده‬ ‫دالیل‬
Varnish Cache
:
1
.
‫باالی‬ ‫مصرف‬ ‫از‬ ‫ناشی‬ ، ‫مجازی‬ ‫سرور‬ ‫لود‬ ‫کاهش‬
CPU
‫سرور‬ ‫وب‬ ‫توسط‬
2
.
‫سایت‬ ‫وب‬ ‫صفحات‬ ‫لود‬ ‫سرعت‬ ‫برابری‬ ‫چند‬ ‫افزایش‬
3
.
‫شما‬ ‫سایت‬ ‫وب‬ ‫همزمان‬ ‫های‬ ‫آنالین‬ ‫تحمل‬ ‫توان‬ ‫و‬ ‫بازدید‬ ‫افزایش‬
‫وارنیش‬
 
‫طرفدار‬ ‫بسیار‬ ‫دروپال‬ ‫های‬ ‫سایت‬ ‫در‬ ‫عالی‬ ‫و‬ ‫موثر‬ ‫بسیار‬ ‫ارتباط‬ ‫برقراری‬ ‫قابلیت‬ ‫و‬ ‫دارد‬ ‫که‬ ‫ساختاری‬ ‫به‬ ‫باتوجه‬
‫هست‬ ‫ثابت‬ ‫پای‬ ‫یک‬ ‫پربازدید‬ ‫دروپالی‬ ‫های‬ ‫سایت‬ ‫اکثر‬ ‫در‬ ‫و‬ ‫دارد‬
‫کند‬ ‫می‬ ‫استفاده‬ ‫وارنیش‬ ‫از‬ ‫باالیش‬ ‫بسیار‬ ‫بازدید‬ ‫به‬ ‫پاسخگویی‬ ‫برای‬ ‫دروپال‬ ‫اصلی‬ ‫سایت‬
‫ذکر‬ ‫باید‬ ‫البته‬
‫کرد‬
‫اورد‬ ‫می‬ ‫وجود‬ ‫به‬ ‫شما‬ ‫سایت‬ ‫برای‬ ‫رو‬ ‫بسیاری‬ ‫مشکالت‬ ‫نشود‬ ‫کانفیگ‬ ‫خوبی‬ ‫به‬ ‫اگر‬ ‫وارنیش‬ ‫که‬
‫و‬ ‫هست‬ ‫بروزرسانی‬ ‫حال‬ ‫در‬ ‫لحظه‬ ‫در‬ ‫شما‬ ‫سایت‬ ‫که‬ ‫شود‬ ‫می‬ ‫نمایان‬ ‫بیشتر‬ ‫هایی‬ ‫سایت‬ ‫برای‬ ‫مشکالت‬ ‫این‬ ‫جمله‬ ‫از‬
‫شما‬ ‫سایت‬ ‫صفحات‬ ‫وارنیش‬ ‫که‬ ‫هست‬ ‫این‬ ‫دلیلش‬ ‫هم‬ ‫واین‬ ‫کند‬ ‫می‬ ‫نمود‬ ‫بیشتر‬ ‫کند‬ ‫می‬ ‫پیدا‬ ‫تغییر‬ ‫شما‬ ‫صفحات‬ ‫مطالب‬
‫پاسخگوی‬ ‫بتواند‬ ‫سرور‬ ‫وب‬ ‫فراخوانی‬ ‫و‬ ‫وقفه‬ ‫بدون‬ ‫بعدی‬ ‫های‬ ‫درخواست‬ ‫در‬ ‫تا‬ ‫کند‬ ‫می‬ ‫ذخیره‬ ‫خودش‬ ‫کش‬ ‫در‬ ‫رو‬
.‫باشد‬ ‫ها‬ ‫درخواست‬
: ‫هست‬ ‫زیر‬ ‫قرار‬ ‫به‬ ‫وارنیش‬ ‫کانفیق‬ ‫از‬ ‫‌هایی‬
‫ه‬‫نمون‬
if (req.request == GET &&
“ ”
req.url ~ .(gif|jpg|jpeg|bmp|png|ico)$ ) {
“ ”
unset req.http.cookie;
set req.grace = 1m;
return(lookup);
}
////Cache images in vcl_recv ////
pic
1
‫ساختار‬ ‫کلی‬ ‫شمای‬ :
varnish
-----------------------------------------------------
if (req.http.cookie) {
set req.http.Cookie = regsuball(req.http.Cookie,
"__utm.=[^;]+(; )?", "");
if (req.http.cookie ~ "^ *$") {
remove req.http.cookie;
}
}
//// Remove Google Analytics in vcl_recv ////
------------------------------------------------------
backend default {
.host="192.168.1.10";
.port="8080";
.probe={
.url= /test.php ;
” ”
}
}
backend second {
.host="192.168.1.20";
.port="8080";
}
////Multiple backend configuration ////
----------------------------------------------------
director balance random {
{ .backend = default; .weight = 1; }
{ .backend = second; .weight = 2; }
}
sub vcl_recv {
set.req.backend = balance;
return(pass);
}
////Load balanced 33 / 66 % config ////
--------------------------------------------------------
if (obj.hits > 0) {
#if hit add hit count
set resp.http.X-Cache = "HIT-" obj.hits;
} else {
set resp.http.X-Cache = "MISS ;
”
}
////Adding headers on response ////
---------------------------------------------------------
no varnish :
default varnish :
--------------------------------------------------------
# Drop any cookies sent to WordPress.
sub vcl_recv {
unset req.http.cookie;
}
# Drop any cookies WordPress tries to send back
sub vcl_fetch {
unset beresp.http.set-cookie;
}
////Kill those cookies!! ////
costume varnish
‫نصب‬ ‫نحوه‬
varnish
:
sudo rpm --nosignature -i http://repo.varnish-cache.org/redhat/
varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm
sudo yum install varnish
‫وارنیش‬ ‫سرویس‬ ‫اجرای‬
# sudo service varnish start
‫اینکه‬ ‫کردن‬ ‫چک‬ ‫برای‬
varnish
‫چه‬ ‫در‬
run level
: ‫داریم‬ ‫دارد‬ ‫قرار‬
# sudo chkconfig --list varnish
varnish0:off 1:off 2:on 3:on 4:on 5:on 6:off
: ‫کردن‬ ‫فعال‬ ‫برای‬
sudo chkconfig varnish on
‫‌رویم‬
‫ی‬‫م‬ ‫کانفیق‬ ‫مسیر‬ ‫به‬
# sudo vim /etc/sysconfig/varnish
‫اینجا‬ ‫در‬
VARNISH_STORAGE
. ‫میکنیم‬ ‫پیدا‬ ‫را‬
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" //‫دستور‬ ‫کلی‬ ‫شکل‬
. ‫دارد‬ ‫ما‬ ‫رم‬ ‫میزان‬ ‫به‬ ‫بستگی‬ ‫ساختار‬ ‫این‬ ‫تنظیم‬
‫ما‬ ‫‌رم‬
: ‫نمونه‬ ‫برای‬
۱۶
‫که‬ . ‫‌باشد‬
‫ی‬‫م‬ ‫گیگ‬
۱۴
. ‫‌دهیم‬
‫ی‬‫م‬ ‫اختصاص‬ ‫گیگ‬
VARNISH_STORAGE_SIZE=14G
‫آپاچی‬ ‫با‬ ‫مثال‬
‫با‬ ‫ارتباط‬
backend servers
:
backend servers
‫سرور‬ ‫همان‬ ‫حقیقت‬ ‫در‬
http
. ‫باشیم‬ ‫ارتباط‬ ‫در‬ ‫آن‬ ‫با‬ ‫‌خواهیم‬
‫ی‬‫م‬ ‫ما‬ ‫که‬ ‫ماست‬
. ‫‌رویم‬
‫ی‬‫م‬ ‫پیش‬ ‫به‬ ‫مثال‬ ‫این‬ ‫با‬ ‫اینجا‬ ‫در‬ . ‫است‬ ‫قرار‬ ‫چه‬ ‫به‬ ‫ما‬ ‫سرور‬ ‫ساحتار‬ ‫و‬ ‫دیاگرام‬ ‫میدانیم‬ ‫ما‬ ‫هرچیر‬ ‫از‬ ‫قبل‬
‫فایل‬ ‫حال‬
vcl
. ‫میکنیم‬ ‫کانفیق‬ ‫رو‬
vim /etc/varnish/default.vcl
: ‫داریم‬ ‫مساله‬ ‫صورت‬ ‫به‬ ‫نسبت‬
backend server01 {
.host = "localhost";
.port = "8080";
}
‫اینجا‬ ‫در‬
server 01
‫حقیقت‬ ‫در‬
FQDN
‫یعنی‬ . ‫‌باشد‬
‫ی‬‫م‬ ‫ما‬
hostname , ip
‫وصل‬ ‫آن‬ ‫به‬ ‫ما‬ ‫هست‬ ‫قرار‬ ‫که‬ ‫پورتی‬ ‫و‬
. ‫شویم‬
. ‫میکنیم‬ ‫ریلود‬ ‫ذخیره‬ ‫از‬ ‫بعد‬
# sudo service varnish reload
‫نیاز‬ ‫به‬ ‫نسبت‬ ‫تا‬ ‫داریم‬ ‫نیاز‬ ‫منظور‬ ‫این‬ ‫برای‬ . ‫میکند‬ ‫سرور‬ ‫کش‬ ‫و‬ ‫سرور‬ ‫بین‬ ‫ارتباط‬ ‫و‬ ‫اتصال‬ ‫به‬ ‫اقدام‬ ‫وارنیش‬ ‫اول‬ ‫وهله‬ ‫در‬
. ‫کنیم‬ ‫سازی‬ ‫سفارشی‬
backend website {
.host = "localhost";
.port = "8080";
.probe = {
.url = "/favicon.ico";
.timeout = 60ms;
.interval = 2s;
.window = 5;
.threshold = 3;
}
}
‫مثال‬ ‫این‬ ‫در‬
backend
‫درخواستی‬ ‫حقیقت‬ ‫در‬ . ‫داریم‬ ‫نمونه‬ ‫برای‬ ‫بخشها‬ ‫از‬ ‫بعضی‬ ‫برای‬ ‫دارد‬ ‫هویت‬ ‫احراز‬ ‫به‬ ‫نیاز‬ ‫سرور‬
. ‫شود‬ ‫بسته‬ ‫باید‬ ‫نهایت‬ ‫در‬ ‫و‬ . ‫‌شود‬
‫ی‬‫م‬ ‫ارسال‬
backend api {
.host = "localhost";
.port = "8080";
.probe = {
.request =
"GET /status HTTP/1.1"
"Host: www.yourhostname.com"
"Connection: close"
"X-API-Key: e4d909c290d0fb1ca068ffaddf22cbd0"
"Accept: application/json"
.timeout = 60ms;
.interval = 2s;
.window = 5;
.threshold = 3;
}
}
‫عکس‬ ‫در‬ ‫که‬ ‫همانطور‬
۱
‫الزمه‬ ‫های‬ ‫دهی‬ ‫مسیر‬ ‫باید‬ ‫کالینت‬ ‫طرف‬ ‫از‬ ‫درخواستی‬ ‫هر‬ ‫در‬ . ‫واریش‬ ‫شمای‬ ‫در‬ . ‫کردیم‬ ‫اشاره‬
. ‫دهیم‬ ‫انجام‬ ‫را‬
vcl_recv {
if ( req.url ~ "/api/") {
set req.backend = api;
} else {
Set req.backend = website;
}
}
‫ساحتار‬ ‫با‬ ‫دراینجا‬
probe , backend
. ‫شد‬ ‫خواهید‬ ‫آشنا‬
probe favicon {
.url = "/favicon.ico";
.timeout = 60ms;
.interval = 2s;
.window = 5;
.threshold = 3;
}
probe robots {
.url = "/robots.txt";
.timeout = 60ms;
.interval = 2s;
.window = 5;
.threshold = 3;
}
backend server01 {
.host = "localhost";
.port = "8080";
.probe = favicon;
}
backend server02 {
.host = "localhost";
.port = "8080";
.probe = robots;
}
‫باالنس‬ ‫لود‬ ‫درخواست‬
‌
:
‫در‬ ‫ما‬ ‫های‬ ‫ترافیک‬ ‫مدیریت‬ ‫برای‬ ‫است‬ ‫متدی‬ ‫کردن‬ ‫باالنس‬ ‫درخواست‬
cluster pool
. ‫را‬ ‫گردی‬ ‫وب‬ ‫از‬ ‫تجربه‬ ‫بهترین‬ ‫میکند‬ ‫گارانتی‬ ‫کاربر‬ ‫برای‬ ‫ساختار‬ ‫این‬
. ‫داریم‬ ‫مفهوم‬ ‫این‬ ‫سازی‬ ‫پیاده‬ ‫برای‬ ‫الگوریتم‬ ‫یا‬ ‫روش‬ ‫شش‬ ‫ما‬ ‫بدانیم‬ ‫باید‬ ‫چیز‬ ‫هر‬ ‫از‬ ‫قبل‬
random, client, hash, round-robin,DNS,fallback
‫خاص‬ ‫فایل‬ ‫یا‬ ‫خاص‬ ‫مسیر‬ ‫برای‬ ‫دانلود‬ ‫میزان‬ ‫محدودیت‬
vcl 4.0;
import tcp;
backend default {
.host = "192.0.2.11";
.port = "8080";
}
sub vcl_recv {
# Shape (pace) the data rate to avoid filling
# router buffers for a single client.
if (req.url ~ ".mp4$") {
tcp.set_socket_pace(10000/8); # [KB/s], so this is 10Mbit/s.
}
}
Backend servers
Varnish has a concept of "backend" or "origin" servers. A backend server is the server providing the content Varnish
will accelerate.
Our first task is to tell Varnish where it can find its backends. Start your favorite text editor and open the relevant VCL
file.
Somewhere in the top there will be a section that looks a bit like this.:
# backend default {
# .host = "127.0.0.1";
# .port = "8080";
# }
We remove the comment markings in this text stanza making the it look like.:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
Now, this piece of configuration defines a backend in Varnish called default. When Varnish needs to get content from
this backend it will connect to port 8080 on localhost (127.0.0.1).
Varnish can have several backends defined you can even join several backends together into clusters of backends for
load balancing purposes.
Multiple backends
At some point you might need Varnish to cache content from several servers. You might want Varnish to map all the
URL into one single host or not. There are lot of options.
Lets say we need to introduce a Java application into out PHP web site. Lets say our Java application should handle
URL beginning with /java/.
We manage to get the thing up and running on port 8000. Now, lets have a look at the default.vcl.:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
We add a new backend.:
backend java {
.host = "127.0.0.1";
.port = "8000";
}
Now we need tell Varnish where to send the difference URL. Lets look at vcl_recv.:
sub vcl_recv {
if (req.url ~ "^/java/") {
set req.backend_hint = java;
} else {
set req.backend_hint = default;
}
}
It's quite simple, really. Lets stop and think about this for a moment. As you can see you can define how you choose
backends based on really arbitrary data. You want to send mobile devices to a different backend? No problem. if
(req.http.User-agent ~ /mobile/) .. should do the trick.
Without an explicit backend selection, varnish will continue using the default backend. If there is no backend named
default, the first backend found in the vcl will be used as the default backend.
Backends and virtual hosts in Varnish
Varnish fully supports virtual hosts. They might however work in a somewhat counter-intuitive fashion since they are
never declared explicitly. You set up the routing of incoming HTTP requests in vcl_recv. If you want this routing to be
done on the basis of virtual hosts you just need to inspect req.http.host.
You can have something like this:
sub vcl_recv {
if (req.http.host ~ "foo.com") {
set req.backend_hint = foo;
} elsif (req.http.host ~ "bar.com") {
set req.backend_hint = bar;
}
}
Note that the first regular expressions will match "foo.com", "www.foo.com", "zoop.foo.com" and any other host ending
in "foo.com". In this example this is intentional but you might want it to be a bit more tight, maybe relying on the ==
operator in stead, like this:
sub vcl_recv {
if (req.http.host == "foo.com" || req.http.host == "www.foo.com") {
set req.backend_hint = foo;
}
}
Directors
You can also group several backend into a group of backends. These groups are called directors. This will give you
increased performance and resilience.
You can define several backends and group them together in a director. This requires you to load a VMOD, a Varnish
module, and then to call certain actions in vcl_init.:
import directors; # load the directors
backend server1 {
.host = "192.168.0.10";
}
backend server2 {
.host = "192.168.0.10";
}
sub vcl_init {
new bar = directors.round_robin();
bar.add_backend(server1);
bar.add_backend(server2);
}
sub vcl_recv {
# send all traffic to the bar director:
set req.backend_hint = bar.backend();
}
This director is a round-robin director. This means the director will distribute the incoming requests on a round-robin
basis. There is also a random director which distributes requests in a, you guessed it, random fashion. If that is not
enough, you can also write your own director (see Writing a Director).
But what if one of your servers goes down? Can Varnish direct all the requests to the healthy server? Sure it can. This is
where the Health Checks come into play.
Health checks
Lets set up a director with two backends and health checks. First let us define the backends:
backend server1 {
.host = "server1.example.com";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
backend server2 {
.host = "server2.example.com";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
What is new here is the probe. In this example Varnish will check the health of each backend every 5 seconds, timing
out after 1 second. Each poll will send a GET request to /. If 3 out of the last 5 polls succeeded the backend is
considered healthy, otherwise it will be marked as sick.
Refer to the Probes section in the VCL documentation for more information.
Now we define the 'director':
import directors;
sub vcl_init {
new vdir = directors.round_robin();
vdir.add_backend(server1);
vdir.add_backend(server2);
}
You use this vdir director as a backend_hint for requests, just like you would with a simple backend. Varnish will not
send traffic to hosts that are marked as unhealthy.
Varnish can also serve stale content if all the backends are down. See Misbehaving servers for more information on how
to enable this.
Please note that Varnish will keep health probes running for all loaded VCLs. Varnish will coalesce probes that seem
identical - so be careful not to change the probe config if you do a lot of VCL loading. Unloading the VCL will discard
the probes. For more information on how to do this please see ref:reference-vcl-director.
changing one s server headers is both practical and fun. It s a good idea to remove information that
’ ’
could help an attacker, and it s also enjoyable to put interesting values in there and see who notices.
’
There are tons of ways of doing this, based on the server you use, but here s a way to do it with
’ Varnish.
Editing default.vcl
In Varnish, your default.vcl file contains the rules that govern your server responses. The vcl_deliver section further
defines what goes out to clients.
By adjusting this section you can strip the values that were set by your backend web server, and substitute your own:
sub vcl_deliver {
remove resp.http.Via;
remove resp.http.X-Whatever;
remove resp.http.X-Powered-By;
remove resp.http.X-Varnish;
remove resp.http.Age;
remove resp.http.Server;
set resp.http.Server = "TFE";
set resp.http.X-Powered-By = "Curiosity";
}

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

‫‪Wazuh‬‬ ‫و‬ ‫‪Ossec‬‬ ‫‪Wazuh‬‬ ‫به‬ ‫‪ossec‬‬ ‫از‬ ‫مهاجرت‬ ‫نحوه‬ ‫همچنین‬
‫‪Wazuh‬‬ ‫و‬ ‫‪Ossec‬‬ ‫‪Wazuh‬‬ ‫به‬ ‫‪ossec‬‬ ‫از‬ ‫مهاجرت‬ ‫نحوه‬ ‫همچنین‬‫‪Wazuh‬‬ ‫و‬ ‫‪Ossec‬‬ ‫‪Wazuh‬‬ ‫به‬ ‫‪ossec‬‬ ‫از‬ ‫مهاجرت‬ ‫نحوه‬ ‫همچنین‬
‫‪Wazuh‬‬ ‫و‬ ‫‪Ossec‬‬ ‫‪Wazuh‬‬ ‫به‬ ‫‪ossec‬‬ ‫از‬ ‫مهاجرت‬ ‫نحوه‬ ‫همچنین‬
 
Zfs and btrfs
Zfs and btrfsZfs and btrfs
Zfs and btrfs
 
how config Naxsi
how config Naxsi how config Naxsi
how config Naxsi
 
Zabbix monitoring website
Zabbix monitoring websiteZabbix monitoring website
Zabbix monitoring website
 
How Create Waf With Naxsi
How Create Waf With NaxsiHow Create Waf With Naxsi
How Create Waf With Naxsi
 
Osm
OsmOsm
Osm
 
کتاب Samba and Nfs
کتاب Samba and Nfsکتاب Samba and Nfs
کتاب Samba and Nfs
 
how upgrade ceph
how upgrade cephhow upgrade ceph
how upgrade ceph
 
Ras in linux
Ras in linuxRas in linux
Ras in linux
 
Ossec و Wazuh
Ossec   و WazuhOssec   و Wazuh
Ossec و Wazuh
 
Beowolf
BeowolfBeowolf
Beowolf
 
Partition in oracle mysql |Mariadb
Partition in oracle mysql |MariadbPartition in oracle mysql |Mariadb
Partition in oracle mysql |Mariadb
 
Docker
DockerDocker
Docker
 
کتاب امنیت
کتاب امنیتکتاب امنیت
کتاب امنیت
 
تجارت الکترونبکی با opencart
تجارت الکترونبکی با opencartتجارت الکترونبکی با opencart
تجارت الکترونبکی با opencart
 
Cisco Exploration 2 In Persion-Muhibullah Aman
Cisco Exploration 2 In Persion-Muhibullah AmanCisco Exploration 2 In Persion-Muhibullah Aman
Cisco Exploration 2 In Persion-Muhibullah Aman
 
(Linux Ubuntu Guide in Persian- Basic)رهنمود سیستم عامل اوبنتو فارسی- محب ال...
 (Linux Ubuntu Guide in Persian- Basic)رهنمود سیستم عامل اوبنتو فارسی- محب ال... (Linux Ubuntu Guide in Persian- Basic)رهنمود سیستم عامل اوبنتو فارسی- محب ال...
(Linux Ubuntu Guide in Persian- Basic)رهنمود سیستم عامل اوبنتو فارسی- محب ال...
 
ips/ids
ips/idsips/ids
ips/ids
 
Package management
Package managementPackage management
Package management
 
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
 (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ... (ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
(ِData Structures-Java Object oriented Programming Languages)ساختارهای دیتا ...
 

Ähnlich wie Varnish

Ähnlich wie Varnish (20)

squid
squidsquid
squid
 
اصول طراحی سایت
اصول طراحی سایتاصول طراحی سایت
اصول طراحی سایت
 
OpenStack and its service
OpenStack and its serviceOpenStack and its service
OpenStack and its service
 
Openstack Rally
Openstack RallyOpenstack Rally
Openstack Rally
 
Load Balancing-as-a-Service (LBaaS) with octavia in openstack
Load Balancing-as-a-Service (LBaaS) with octavia in openstackLoad Balancing-as-a-Service (LBaaS) with octavia in openstack
Load Balancing-as-a-Service (LBaaS) with octavia in openstack
 
حل مشکل خطا در برقراری ارتباط با پایگاه داده وردپرس
حل مشکل خطا در برقراری ارتباط با پایگاه داده وردپرسحل مشکل خطا در برقراری ارتباط با پایگاه داده وردپرس
حل مشکل خطا در برقراری ارتباط با پایگاه داده وردپرس
 
Node js-&-express-hassan-tafreshi-persian-lan
Node js-&-express-hassan-tafreshi-persian-lanNode js-&-express-hassan-tafreshi-persian-lan
Node js-&-express-hassan-tafreshi-persian-lan
 
Ulimit
UlimitUlimit
Ulimit
 
خرید هاست وردپرس
خرید هاست وردپرسخرید هاست وردپرس
خرید هاست وردپرس
 
Proxmox
ProxmoxProxmox
Proxmox
 
386 wp
386 wp386 wp
386 wp
 
Wp
WpWp
Wp
 
مسیردهی و پروتوکولهای مسیریابی
مسیردهی و پروتوکولهای مسیریابیمسیردهی و پروتوکولهای مسیریابی
مسیردهی و پروتوکولهای مسیریابی
 
Content management system
Content management systemContent management system
Content management system
 
PHP Web service - وب سرویس
PHP Web service - وب سرویسPHP Web service - وب سرویس
PHP Web service - وب سرویس
 
Redis.
Redis.Redis.
Redis.
 
Introduction to oracle
Introduction to oracleIntroduction to oracle
Introduction to oracle
 
ارائه ابزار.pptx
ارائه ابزار.pptxارائه ابزار.pptx
ارائه ابزار.pptx
 
نصب وردپرس با xampp
نصب وردپرس با xamppنصب وردپرس با xampp
نصب وردپرس با xampp
 
شبکه توزیع محتوا
شبکه توزیع محتواشبکه توزیع محتوا
شبکه توزیع محتوا
 

Mehr von Yashar Esmaildokht

Mehr von Yashar Esmaildokht (20)

File Integrity Monitoring ( FIM )
File  Integrity   Monitoring     ( FIM )File  Integrity   Monitoring     ( FIM )
File Integrity Monitoring ( FIM )
 
how install and config sdn in proxmox virtualization
how install and config sdn in proxmox virtualizationhow install and config sdn in proxmox virtualization
how install and config sdn in proxmox virtualization
 
service registery and the service discovery
service registery and the service discoveryservice registery and the service discovery
service registery and the service discovery
 
process
processprocess
process
 
nbd and it's benefits
nbd and it's benefitsnbd and it's benefits
nbd and it's benefits
 
مرجع oracle mysql |mariadb
مرجع oracle mysql |mariadb مرجع oracle mysql |mariadb
مرجع oracle mysql |mariadb
 
openstack designate
openstack designateopenstack designate
openstack designate
 
bcache and cachefs its benefits.
bcache and cachefs   its benefits. bcache and cachefs   its benefits.
bcache and cachefs its benefits.
 
Systemd and its various uses and capabilities.
Systemd and its various uses and capabilities.Systemd and its various uses and capabilities.
Systemd and its various uses and capabilities.
 
radosgw
radosgw radosgw
radosgw
 
cachefs
cachefs cachefs
cachefs
 
how add and remove Mgr in ceph cluster
how add and remove  Mgr in ceph  clusterhow add and remove  Mgr in ceph  cluster
how add and remove Mgr in ceph cluster
 
how add and delete new mon in ceph cluster
how add  and delete new  mon in ceph clusterhow add  and delete new  mon in ceph cluster
how add and delete new mon in ceph cluster
 
Nfs Acl
Nfs AclNfs Acl
Nfs Acl
 
nbd
nbdnbd
nbd
 
raid with megacli
raid with megacliraid with megacli
raid with megacli
 
نحوه ایجاد snapshot و ایجاد point در سیستم‌های گنو/لینوکسی برای ایجاد sys...
 نحوه ایجاد snapshot  و ایجاد point  در سیستم‌های گنو/لینوکسی  برای ایجاد sys... نحوه ایجاد snapshot  و ایجاد point  در سیستم‌های گنو/لینوکسی  برای ایجاد sys...
نحوه ایجاد snapshot و ایجاد point در سیستم‌های گنو/لینوکسی برای ایجاد sys...
 
linux industry
linux industrylinux industry
linux industry
 
security book
security book security book
security book
 
how use iptables
how use iptables how use iptables
how use iptables
 

Varnish

  • 1.
  • 2. ‫خدا‬ ‫نام‬ ‫به‬ varnish ‫دخت‬ ‫اسمعیل‬ ‫یاشار‬ : ‫نویسنده‬ ‫نسخه‬ ۰.۱
  • 3. : ‫نویسنده‬ ‫باره‬ ‫در‬ ‫رشته‬ ‫آموخته‬ ‫دانش‬ ‫دخت‬ ‫اسمعیل‬ ‫یاشار‬ ‫بنده‬ cyber security . ‫هستم‬ ‫از‬ ‫بیش‬ ۱۵ . ‫دارم‬ ‫فعالیت‬ ‫سابقه‬ ‫سال‬ ‫مولف‬ - ‫مدرس‬ - ‫مشاور‬ : ‫داد‬ ‫شرح‬ ‫زیر‬ ‫های‬ ‫ساختار‬ ‫در‬ ‫میتوان‬ ‫را‬ ‫بنده‬ ‫های‬ ‫فعالیت‬ ‫جمله‬ ‫از‬ gnu/linux system/network/security Engineer/administrator & oracle dba | Linux Trainer |devops . ): ‫جدید‬ ‫دنیاهای‬ ‫کشف‬ ‫و‬ ‫تحقیق‬ ‫و‬ ‫مطالعه‬ ‫به‬ ‫مند‬ ‫عالقه‬ . ‫کنم‬ ‫اشاره‬ ‫استراتژی‬ ‫های‬ ‫بازی‬ ‫و‬ ‫اوتلو‬ ‫و‬ ‫شطرنج‬ ‫بازی‬ ‫به‬ ‫میتوانم‬ ‫من‬ ‫های‬ ‫سرگرمی‬ ‫از‬ ‫واقع‬ ‫در‬ ‫بنیان‬ ‫از‬ ‫یکی‬ ‫و‬ ‫لینوکس‬/‫گنو‬ ‫و‬ ‫باز‬ ‫متن‬ ‫دنیای‬ ‫عاشق‬ . ‫هستم‬ ‫عاشق‬ ‫یک‬ ‫من‬ ‫گذ‬ ‫تبریز‬ ‫الگ‬ ‫اران‬ : ‫کنید‬ ‫پیدا‬ ‫و‬ ‫کنید‬ ‫دنبال‬ ‫را‬ ‫من‬ ‫میتوانید‬ ‫چطور‬ ‫خب‬ Mob : 09141100257 Telegram ID Telegram channel Instagram Account Linkedin Account . ‫بشنوم‬ ‫را‬ ‫انتقادتون‬ ‫یا‬ ‫پیشنهاد‬ ‫هرگونه‬ ‫میشم‬ ‫خوشحال‬ ‫همچنین‬ ‫چ‬ : ‫کنید‬ ‫پیدا‬ ‫را‬ ‫من‬ ‫از‬ ‫ی‬ ‫دیگر‬ ‫های‬ ‫کتاب‬ ‫میتونید‬ ‫طور‬ ‫توی‬ slideshare . ‫کنید‬ ‫پیدا‬ ‫را‬ ‫کردم‬ ‫منتشر‬ ‫آزاد‬ ‫بصورت‬ ‫که‬ ‫دیگری‬ ‫های‬ ‫کتاب‬ ‫میتونید‬ ‫بگردید‬ ‫من‬ ‫اسم‬ ‫دنبال‬ ‫گوگل‬ ‫یا‬
  • 4. ‫؟‬ ‫کیست‬ ‫ی‬ ‫برا‬ ‫کتاب‬ ‫این‬ ‫برای‬ ‫کتاب‬ ‫این‬ sys admin ‫و‬ sys enginner ‫و‬ ‫شده‬ ‫تهیه‬ ‫ها‬ ‫الیه‬ ‫شبکه‬ ‫های‬ ‫پروتکل‬ ‫از‬ ‫درستی‬ ‫درک‬ ‫که‬ ‫کسانی‬ ۷ . ‫دارند‬ ‫شرح‬ ‫و‬ ‫تعریف‬ ‫از‬ ‫قسمتی‬ : ‫نکته‬ varnish ‫شده‬ ‫برداشت‬ ‫اینترنت‬ ‫از‬ . ‫است‬
  • 5. ( ‫وارنیش‬ Varnish ‫استفاده‬ ‫مورد‬ ‫امنیتی‬ ‫سیستم‬ ‫یک‬ ‫بصورت‬ ‫هم‬ ‫کشینگ‬ ‫بصورت‬ ‫هم‬ ‫وارنیش‬.‫است‬ ‫سرور‬ ‫وب‬ ‫برای‬ ‫کشینگ‬ ‫سیستم‬ ‫یک‬ ) ‫سیستم‬ ‫یک‬ ‫خود‬ ‫در‬ ‫یعنی‬ .‫میگیرد‬ ‫قرار‬ waf . ‫میباشد‬ ‫وب‬ ‫شتابدهنده‬ ‫یک‬ ‫همچنین‬ . ‫دارد‬ ‫قدرتمند‬ ‫در‬ ‫که‬ ‫است‬ ‫بصورتی‬ ‫آن‬ ‫عملکرد‬ ‫سیستم‬   .‫میشود‬ ‫هاست‬ ‫روی‬ ‫سایت‬ ‫وب‬ ‫سرعت‬ ‫افزایش‬ ‫باعث‬ ‫و‬ ‫میگیرد‬ ‫قرار‬ ‫سرور‬ ‫وب‬ ‫مقابل‬ (‫وارنیش‬ Varnish ‫؟‬ ‫میکند‬ ‫کار‬ ‫چگونه‬ ) ‫ارسال‬ ‫درخواستهای‬ ‫به‬ ‫سرعت‬ ‫به‬ ‫و‬ ‫میکند‬ ‫زخیره‬ ‫هاست‬ ‫سرور‬ ‫حافظه‬ ‫روی‬ ‫را‬ ‫شما‬ ‫سایت‬ ‫وب‬ ‫استاتیک‬ ‫اطالعات‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬ .‫میدهد‬ ‫پاسخ‬ ‫کاربران‬ ‫سمت‬ ‫از‬ ‫شده‬ ‫پردازش‬ ‫کاهش‬ ‫سیستم‬ ‫این‬ ‫دیگر‬ ‫مزیت‬ CPU ‫میزان‬ ‫آمدن‬ ‫پایین‬ ‫و‬ CPU Usage ‫دیتابیس‬ ‫از‬ ‫اطالعاتی‬ ‫و‬ ‫ها‬ ‫فایل‬ ‫نمایش‬ ‫سرعت‬ ‫افزایش‬ ، .‫شود‬ ‫داده‬ ‫نمایش‬ ‫و‬ ‫استخراج‬ ‫آنها‬ ‫اطالعات‬ ‫آنی‬ ‫و‬ ‫ای‬ ‫لحظه‬ ‫بصورت‬ ‫نیست‬ ‫الزم‬ ‫که‬ ‫است‬ (‫وارنیش‬ ‫کشینگ‬ ‫با‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫عملکرد‬ Varnish ) ‫با‬ ‫و‬ ‫است‬ ‫اصلی‬ ‫سرور‬ ‫روی‬ ‫تغییر‬ ‫بدون‬ ‫و‬ ‫تکراری‬ ‫بصورت‬ ‫ها‬ ‫درخواست‬ ‫این‬ ‫که‬ ‫دارد‬ ‫وجود‬ ‫هایی‬ ‫درخواست‬ ‫همیشه‬ ‫سرورها‬ ‫وب‬ ‫روی‬ ‫در‬ .‫یابد‬ ‫می‬ ‫کاهش‬ ‫شدت‬ ‫به‬ ‫سرور‬ ‫منابع‬ ‫از‬ ‫استفاده‬ ‫و‬ ‫افزایش‬ ‫پاسخگویی‬ ‫سرعت‬ ‫کشینگ‬ ‫سیستم‬ ‫طریق‬ ‫از‬ ‫ها‬ ‫نیاز‬ ‫این‬ ‫به‬ ‫پاسخگویی‬ : ‫است‬ ‫شده‬ ‫داده‬ ‫نشان‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫با‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬ ‫عملکرد‬ ‫دیاگرام‬ ‫زیر‬ ‫تصویر‬ ‫در‬
  • 6. (‫وارنیش‬ ‫کشینگ‬ ‫بدون‬ ‫آپاچی‬ ‫سرور‬ ‫وب‬ ‫عملکرد‬ Varnish ) ‫با‬ ‫نهایت‬ ‫در‬ ‫و‬ ‫پی‬ ‫اچ‬ ‫پی‬ ‫با‬ ‫ارتباط‬ ‫زیادی‬ ‫تعداد‬ ‫وارنیش‬ ‫کشینگ‬ ‫از‬ ‫استفاده‬ ‫بدون‬ ‫سرور‬ ‫وب‬ ‫میکنید‬ ‫مشاهده‬ ‫زیر‬ ‫تصویر‬ ‫در‬ ‫که‬ ‫همانطوری‬ (‫ال‬ ‫کیو‬ ‫اس‬ ‫مای‬ ‫دیتابیس‬ mysql ‫مانند‬ ‫سرور‬ ‫منابع‬ ‫از‬ ‫الزم‬ ‫غیر‬ ‫استفاده‬ ‫و‬ ‫شدن‬ ‫کند‬ ‫باعث‬ ‫که‬ ‫میشود‬ ‫برقرار‬ ) CPU .‫میشود‬ .‫میدهد‬ ‫نمایش‬ ‫را‬ ‫وارنیش‬ ‫کشینگ‬ ‫سیستم‬ ‫بدون‬ ‫آپاچی‬ ‫عملکرد‬ ‫نحوه‬ ‫زیر‬ ‫دیاگرام‬
  • 7. ‫سیستم‬ ‫در‬ Varnish Cache ‫ارسال‬ ‫امکان‬ http header ‫دارد‬ ‫وجود‬ ‫بازدیدکننده‬ ‫کامپیوتر‬ ‫یا‬ ‫نویسی‬ ‫برنامه‬ ‫اسکریپت‬ ‫به‬ ‫به‬ ‫موسوم‬ ‫جاوا‬ ‫نویسی‬ ‫برنامه‬ ‫زبان‬ ‫طریق‬ ‫از‬ ‫موضوع‬ ‫این‬ ‫که‬ VCL .‫است‬ ‫پذیر‬ ‫امکان‬ ‫کش‬ ‫وارنیش‬ varnish cache ‫دهنده‬ ‫شتاب‬ ‫یک‬ HTTP ‫و‬ https . ‫میباشد‬ ‫های‬ ‫سایت‬ ‫وب‬ ‫برای‬ ‫شده‬ ‫طراحی‬ ‫که‬ .‫باال‬ ‫بسیار‬ ‫بازدید‬ ‫با‬ ‫داینامیک‬ Varnish ‫مثل‬ ‫دیگری‬ ‫های‬ ‫سرور‬ ‫کش‬ ‫خالف‬ ‫بر‬ Squid ‫برای‬ ‫که‬ HTTP ‫و‬ SMTP ‫و‬ FTP ‫طور‬ ‫به‬ .‫شود‬ ‫می‬ ‫کاربرده‬ ‫به‬ ‫روی‬ ‫بر‬ ‫تخصصی‬ HTTP .‫است‬ ‫شده‬ ‫متمرکز‬ ‫مجوز‬ ‫دو‬ ‫تحت‬ ،‫است‬ ‫باز‬ ‫منبع‬ ‫وارنیش‬ BSD ‫نسخه‬ .‫است‬ ‫شده‬ ‫منتشر‬ 1.0 ‫سال‬ ‫در‬ ‫وارنیش‬ ‫از‬ 2006 ‫وارنیش‬ .‫شد‬ ‫منتشر‬ 2.0 ‫سال‬ ‫در‬ 2008 ‫وارنیش‬ ‫و‬ ،‫شد‬ ‫منتشر‬ 3.0 ‫سال‬ ‫در‬ 2011 .‫شد‬ ‫منتشر‬ ‫پروژه‬   ‫وارنیش‬   ‫زبان‬ ‫به‬ .‫است‬ ‫شده‬ ‫آغاز‬ ‫نروژی‬ ‫آنالین‬ ‫روزنامه‬ ‫یک‬ ‫توسط‬ C ‫های‬ ‫عامل‬ ‫سیستم‬ ‫برای‬ ‫و‬ ‫است‬ ‫نوشته‬ ..‫دارد‬ ‫را‬ ‫معروف‬ ‫های‬ ‫عامل‬ ‫سیستم‬ ‫همه‬ ‫روی‬ ‫بر‬ ‫نصب‬ ‫قابلیت‬ ‫وارنیش‬ ‫که‬ ‫بگم‬ ‫باید‬ ‫البته‬ ‫است‬ ‫شده‬ ‫طراحی‬ ‫یونیکس‬ ‫توسط‬   Poul-Henning Kamp .‫شود‬ ‫می‬ ‫داده‬ ‫توسعه‬ , ‫در‬ ‫اطالعات‬   ‫و‬ ‫رم‬ ‫حافظه‬ ‫در‬ ‫اطالعاتی‬ ‫چه‬ ‫که‬ ‫گیرد‬ ‫می‬ ‫تصمیم‬ ‫سپس‬ ‫و‬.‫شود‬ ‫می‬ ‫ذخیره‬ ‫سیستم‬ ‫رم‬ ‫حافظه‬ ‫در‬ ‫وارنیش‬ .‫کند‬ ‫پیدا‬ ‫انتقال‬ ‫سیستم‬ ‫هارد‬ ‫به‬ ‫اطالعتی‬ ‫چه‬ ‫همپچنین‬ ‫برسدو‬ ‫کانکشن‬ ‫تعداد‬ ‫محدودیت‬ ‫به‬ ‫که‬ ‫وقتی‬ ‫تا‬ ‫دهد‬ ‫می‬ ‫اختصاص‬ ‫جداگانه‬ ‫ترد‬ ‫بک‬ ‫اتصال‬ ‫هر‬ ‫با‬ ‫وارنیش‬ ‫قرار‬ ‫ریز‬ ‫سر‬ ‫صف‬ ‫در‬ ‫را‬ ‫جدید‬ ‫ورودی‬ ‫های‬ ‫درخواست‬ ‫ک‬.‫دهد‬ ‫می‬ ‫وارنیش‬   ‫پسوند‬ ‫با‬ ‫فایلی‬ ‫ساختار‬ ‫از‬ ‫خود‬ ‫پیکربندی‬ ‫برای‬ VCL ‫که‬ ‫کند‬ ‫می‬ ‫استفاده‬   ‫زبان‬ ‫وسیله‬ ‫به‬ C ‫نویسی‬ ‫اسکریپت‬ ‫شود‬ ‫می‬ ‫انجام‬ ‫برایش‬ Varnish ‫از‬ ‫همچنین‬     load balancing   ‫و‬ ‫الگوریتم‬   round robin   .‫کند‬ ‫می‬ ‫پشتیبانی‬ ‫خوبی‬ ‫به‬   . ‫برای‬ ‫ها‬ ‫پالگین‬ ‫نوشتن‬ ‫قابلیت‬   ‫وارنیش‬   ‫ماژول‬ ‫از‬ ‫استفاده‬ ‫یا‬ ‫و‬ ‫نوشتن‬ ‫با‬ ‫شما‬ ‫که‬ ‫هست‬ ‫ان‬ ‫خوب‬ ‫بسیار‬ ‫مزایای‬ ‫جمله‬ ‫از‬ ‫به‬ ‫توانم‬ ‫می‬ ‫معروف‬ ‫های‬ ‫ماژول‬ ‫جمله‬ ‫از‬ ‫بدهید‬ ‫جواب‬ ‫خود‬ ‫نیازهای‬ ‫از‬ ‫خیلی‬ ‫به‬ ‫تونید‬ ‫می‬ ‫وارنیش‬ ‫برای‬ ‫شده‬ ‫نوشته‬ ‫های‬ Vanirsh security .‫ببرم‬ ‫نام‬ ‫را‬   ‫از‬ ‫پشیبانی‬   ESI
  • 8. ‫سازی‬ ‫فشرده‬ GZIP ‫آن‬ ‫استخراج‬ ‫و‬ ‫دیگر‬ ‫بسیار‬ ‫های‬ ‫قابلیت‬ ‫و‬ ‫از‬ ‫استفاده‬ ‫دالیل‬ Varnish Cache : 1 . ‫باالی‬ ‫مصرف‬ ‫از‬ ‫ناشی‬ ، ‫مجازی‬ ‫سرور‬ ‫لود‬ ‫کاهش‬ CPU ‫سرور‬ ‫وب‬ ‫توسط‬ 2 . ‫سایت‬ ‫وب‬ ‫صفحات‬ ‫لود‬ ‫سرعت‬ ‫برابری‬ ‫چند‬ ‫افزایش‬ 3 . ‫شما‬ ‫سایت‬ ‫وب‬ ‫همزمان‬ ‫های‬ ‫آنالین‬ ‫تحمل‬ ‫توان‬ ‫و‬ ‫بازدید‬ ‫افزایش‬ ‫وارنیش‬   ‫طرفدار‬ ‫بسیار‬ ‫دروپال‬ ‫های‬ ‫سایت‬ ‫در‬ ‫عالی‬ ‫و‬ ‫موثر‬ ‫بسیار‬ ‫ارتباط‬ ‫برقراری‬ ‫قابلیت‬ ‫و‬ ‫دارد‬ ‫که‬ ‫ساختاری‬ ‫به‬ ‫باتوجه‬ ‫هست‬ ‫ثابت‬ ‫پای‬ ‫یک‬ ‫پربازدید‬ ‫دروپالی‬ ‫های‬ ‫سایت‬ ‫اکثر‬ ‫در‬ ‫و‬ ‫دارد‬ ‫کند‬ ‫می‬ ‫استفاده‬ ‫وارنیش‬ ‫از‬ ‫باالیش‬ ‫بسیار‬ ‫بازدید‬ ‫به‬ ‫پاسخگویی‬ ‫برای‬ ‫دروپال‬ ‫اصلی‬ ‫سایت‬ ‫ذکر‬ ‫باید‬ ‫البته‬ ‫کرد‬ ‫اورد‬ ‫می‬ ‫وجود‬ ‫به‬ ‫شما‬ ‫سایت‬ ‫برای‬ ‫رو‬ ‫بسیاری‬ ‫مشکالت‬ ‫نشود‬ ‫کانفیگ‬ ‫خوبی‬ ‫به‬ ‫اگر‬ ‫وارنیش‬ ‫که‬ ‫و‬ ‫هست‬ ‫بروزرسانی‬ ‫حال‬ ‫در‬ ‫لحظه‬ ‫در‬ ‫شما‬ ‫سایت‬ ‫که‬ ‫شود‬ ‫می‬ ‫نمایان‬ ‫بیشتر‬ ‫هایی‬ ‫سایت‬ ‫برای‬ ‫مشکالت‬ ‫این‬ ‫جمله‬ ‫از‬ ‫شما‬ ‫سایت‬ ‫صفحات‬ ‫وارنیش‬ ‫که‬ ‫هست‬ ‫این‬ ‫دلیلش‬ ‫هم‬ ‫واین‬ ‫کند‬ ‫می‬ ‫نمود‬ ‫بیشتر‬ ‫کند‬ ‫می‬ ‫پیدا‬ ‫تغییر‬ ‫شما‬ ‫صفحات‬ ‫مطالب‬ ‫پاسخگوی‬ ‫بتواند‬ ‫سرور‬ ‫وب‬ ‫فراخوانی‬ ‫و‬ ‫وقفه‬ ‫بدون‬ ‫بعدی‬ ‫های‬ ‫درخواست‬ ‫در‬ ‫تا‬ ‫کند‬ ‫می‬ ‫ذخیره‬ ‫خودش‬ ‫کش‬ ‫در‬ ‫رو‬ .‫باشد‬ ‫ها‬ ‫درخواست‬
  • 9. : ‫هست‬ ‫زیر‬ ‫قرار‬ ‫به‬ ‫وارنیش‬ ‫کانفیق‬ ‫از‬ ‫‌هایی‬ ‫ه‬‫نمون‬ if (req.request == GET && “ ” req.url ~ .(gif|jpg|jpeg|bmp|png|ico)$ ) { “ ” unset req.http.cookie; set req.grace = 1m; return(lookup); } ////Cache images in vcl_recv //// pic 1 ‫ساختار‬ ‫کلی‬ ‫شمای‬ : varnish
  • 10. ----------------------------------------------------- if (req.http.cookie) { set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", ""); if (req.http.cookie ~ "^ *$") { remove req.http.cookie; } } //// Remove Google Analytics in vcl_recv //// ------------------------------------------------------ backend default { .host="192.168.1.10"; .port="8080"; .probe={ .url= /test.php ; ” ”
  • 11. } } backend second { .host="192.168.1.20"; .port="8080"; } ////Multiple backend configuration //// ---------------------------------------------------- director balance random { { .backend = default; .weight = 1; } { .backend = second; .weight = 2; } } sub vcl_recv { set.req.backend = balance; return(pass); } ////Load balanced 33 / 66 % config ////
  • 12. -------------------------------------------------------- if (obj.hits > 0) { #if hit add hit count set resp.http.X-Cache = "HIT-" obj.hits; } else { set resp.http.X-Cache = "MISS ; ” } ////Adding headers on response //// ---------------------------------------------------------
  • 14. default varnish : -------------------------------------------------------- # Drop any cookies sent to WordPress. sub vcl_recv { unset req.http.cookie; } # Drop any cookies WordPress tries to send back sub vcl_fetch { unset beresp.http.set-cookie; }
  • 15. ////Kill those cookies!! //// costume varnish
  • 16. ‫نصب‬ ‫نحوه‬ varnish : sudo rpm --nosignature -i http://repo.varnish-cache.org/redhat/ varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm sudo yum install varnish ‫وارنیش‬ ‫سرویس‬ ‫اجرای‬ # sudo service varnish start ‫اینکه‬ ‫کردن‬ ‫چک‬ ‫برای‬ varnish ‫چه‬ ‫در‬ run level : ‫داریم‬ ‫دارد‬ ‫قرار‬ # sudo chkconfig --list varnish varnish0:off 1:off 2:on 3:on 4:on 5:on 6:off : ‫کردن‬ ‫فعال‬ ‫برای‬ sudo chkconfig varnish on ‫‌رویم‬ ‫ی‬‫م‬ ‫کانفیق‬ ‫مسیر‬ ‫به‬
  • 17. # sudo vim /etc/sysconfig/varnish ‫اینجا‬ ‫در‬ VARNISH_STORAGE . ‫میکنیم‬ ‫پیدا‬ ‫را‬ VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" //‫دستور‬ ‫کلی‬ ‫شکل‬ . ‫دارد‬ ‫ما‬ ‫رم‬ ‫میزان‬ ‫به‬ ‫بستگی‬ ‫ساختار‬ ‫این‬ ‫تنظیم‬ ‫ما‬ ‫‌رم‬ : ‫نمونه‬ ‫برای‬ ۱۶ ‫که‬ . ‫‌باشد‬ ‫ی‬‫م‬ ‫گیگ‬ ۱۴ . ‫‌دهیم‬ ‫ی‬‫م‬ ‫اختصاص‬ ‫گیگ‬ VARNISH_STORAGE_SIZE=14G ‫آپاچی‬ ‫با‬ ‫مثال‬
  • 18. ‫با‬ ‫ارتباط‬ backend servers : backend servers ‫سرور‬ ‫همان‬ ‫حقیقت‬ ‫در‬ http . ‫باشیم‬ ‫ارتباط‬ ‫در‬ ‫آن‬ ‫با‬ ‫‌خواهیم‬ ‫ی‬‫م‬ ‫ما‬ ‫که‬ ‫ماست‬ . ‫‌رویم‬ ‫ی‬‫م‬ ‫پیش‬ ‫به‬ ‫مثال‬ ‫این‬ ‫با‬ ‫اینجا‬ ‫در‬ . ‫است‬ ‫قرار‬ ‫چه‬ ‫به‬ ‫ما‬ ‫سرور‬ ‫ساحتار‬ ‫و‬ ‫دیاگرام‬ ‫میدانیم‬ ‫ما‬ ‫هرچیر‬ ‫از‬ ‫قبل‬
  • 19. ‫فایل‬ ‫حال‬ vcl . ‫میکنیم‬ ‫کانفیق‬ ‫رو‬ vim /etc/varnish/default.vcl
  • 20. : ‫داریم‬ ‫مساله‬ ‫صورت‬ ‫به‬ ‫نسبت‬ backend server01 { .host = "localhost"; .port = "8080"; } ‫اینجا‬ ‫در‬ server 01 ‫حقیقت‬ ‫در‬ FQDN ‫یعنی‬ . ‫‌باشد‬ ‫ی‬‫م‬ ‫ما‬ hostname , ip ‫وصل‬ ‫آن‬ ‫به‬ ‫ما‬ ‫هست‬ ‫قرار‬ ‫که‬ ‫پورتی‬ ‫و‬ . ‫شویم‬ . ‫میکنیم‬ ‫ریلود‬ ‫ذخیره‬ ‫از‬ ‫بعد‬ # sudo service varnish reload ‫نیاز‬ ‫به‬ ‫نسبت‬ ‫تا‬ ‫داریم‬ ‫نیاز‬ ‫منظور‬ ‫این‬ ‫برای‬ . ‫میکند‬ ‫سرور‬ ‫کش‬ ‫و‬ ‫سرور‬ ‫بین‬ ‫ارتباط‬ ‫و‬ ‫اتصال‬ ‫به‬ ‫اقدام‬ ‫وارنیش‬ ‫اول‬ ‫وهله‬ ‫در‬ . ‫کنیم‬ ‫سازی‬ ‫سفارشی‬ backend website { .host = "localhost"; .port = "8080"; .probe = { .url = "/favicon.ico"; .timeout = 60ms;
  • 21. .interval = 2s; .window = 5; .threshold = 3; } } ‫مثال‬ ‫این‬ ‫در‬ backend ‫درخواستی‬ ‫حقیقت‬ ‫در‬ . ‫داریم‬ ‫نمونه‬ ‫برای‬ ‫بخشها‬ ‫از‬ ‫بعضی‬ ‫برای‬ ‫دارد‬ ‫هویت‬ ‫احراز‬ ‫به‬ ‫نیاز‬ ‫سرور‬ . ‫شود‬ ‫بسته‬ ‫باید‬ ‫نهایت‬ ‫در‬ ‫و‬ . ‫‌شود‬ ‫ی‬‫م‬ ‫ارسال‬ backend api { .host = "localhost"; .port = "8080"; .probe = { .request = "GET /status HTTP/1.1" "Host: www.yourhostname.com" "Connection: close" "X-API-Key: e4d909c290d0fb1ca068ffaddf22cbd0" "Accept: application/json" .timeout = 60ms; .interval = 2s;
  • 22. .window = 5; .threshold = 3; } } ‫عکس‬ ‫در‬ ‫که‬ ‫همانطور‬ ۱ ‫الزمه‬ ‫های‬ ‫دهی‬ ‫مسیر‬ ‫باید‬ ‫کالینت‬ ‫طرف‬ ‫از‬ ‫درخواستی‬ ‫هر‬ ‫در‬ . ‫واریش‬ ‫شمای‬ ‫در‬ . ‫کردیم‬ ‫اشاره‬ . ‫دهیم‬ ‫انجام‬ ‫را‬ vcl_recv { if ( req.url ~ "/api/") { set req.backend = api; } else { Set req.backend = website; } } ‫ساحتار‬ ‫با‬ ‫دراینجا‬ probe , backend . ‫شد‬ ‫خواهید‬ ‫آشنا‬
  • 23. probe favicon { .url = "/favicon.ico"; .timeout = 60ms; .interval = 2s; .window = 5; .threshold = 3; } probe robots { .url = "/robots.txt"; .timeout = 60ms; .interval = 2s; .window = 5; .threshold = 3; } backend server01 { .host = "localhost"; .port = "8080"; .probe = favicon; } backend server02 { .host = "localhost";
  • 24. .port = "8080"; .probe = robots; }
  • 25. ‫باالنس‬ ‫لود‬ ‫درخواست‬ ‌ : ‫در‬ ‫ما‬ ‫های‬ ‫ترافیک‬ ‫مدیریت‬ ‫برای‬ ‫است‬ ‫متدی‬ ‫کردن‬ ‫باالنس‬ ‫درخواست‬ cluster pool . ‫را‬ ‫گردی‬ ‫وب‬ ‫از‬ ‫تجربه‬ ‫بهترین‬ ‫میکند‬ ‫گارانتی‬ ‫کاربر‬ ‫برای‬ ‫ساختار‬ ‫این‬ . ‫داریم‬ ‫مفهوم‬ ‫این‬ ‫سازی‬ ‫پیاده‬ ‫برای‬ ‫الگوریتم‬ ‫یا‬ ‫روش‬ ‫شش‬ ‫ما‬ ‫بدانیم‬ ‫باید‬ ‫چیز‬ ‫هر‬ ‫از‬ ‫قبل‬ random, client, hash, round-robin,DNS,fallback
  • 26.
  • 27. ‫خاص‬ ‫فایل‬ ‫یا‬ ‫خاص‬ ‫مسیر‬ ‫برای‬ ‫دانلود‬ ‫میزان‬ ‫محدودیت‬ vcl 4.0; import tcp; backend default { .host = "192.0.2.11"; .port = "8080"; } sub vcl_recv { # Shape (pace) the data rate to avoid filling # router buffers for a single client. if (req.url ~ ".mp4$") { tcp.set_socket_pace(10000/8); # [KB/s], so this is 10Mbit/s. } }
  • 28. Backend servers Varnish has a concept of "backend" or "origin" servers. A backend server is the server providing the content Varnish will accelerate. Our first task is to tell Varnish where it can find its backends. Start your favorite text editor and open the relevant VCL file. Somewhere in the top there will be a section that looks a bit like this.: # backend default { # .host = "127.0.0.1"; # .port = "8080"; # } We remove the comment markings in this text stanza making the it look like.: backend default { .host = "127.0.0.1"; .port = "8080"; } Now, this piece of configuration defines a backend in Varnish called default. When Varnish needs to get content from this backend it will connect to port 8080 on localhost (127.0.0.1). Varnish can have several backends defined you can even join several backends together into clusters of backends for load balancing purposes. Multiple backends At some point you might need Varnish to cache content from several servers. You might want Varnish to map all the URL into one single host or not. There are lot of options. Lets say we need to introduce a Java application into out PHP web site. Lets say our Java application should handle URL beginning with /java/. We manage to get the thing up and running on port 8000. Now, lets have a look at the default.vcl.: backend default { .host = "127.0.0.1"; .port = "8080";
  • 29. } We add a new backend.: backend java { .host = "127.0.0.1"; .port = "8000"; } Now we need tell Varnish where to send the difference URL. Lets look at vcl_recv.: sub vcl_recv { if (req.url ~ "^/java/") { set req.backend_hint = java; } else { set req.backend_hint = default; } } It's quite simple, really. Lets stop and think about this for a moment. As you can see you can define how you choose backends based on really arbitrary data. You want to send mobile devices to a different backend? No problem. if (req.http.User-agent ~ /mobile/) .. should do the trick. Without an explicit backend selection, varnish will continue using the default backend. If there is no backend named default, the first backend found in the vcl will be used as the default backend. Backends and virtual hosts in Varnish Varnish fully supports virtual hosts. They might however work in a somewhat counter-intuitive fashion since they are never declared explicitly. You set up the routing of incoming HTTP requests in vcl_recv. If you want this routing to be done on the basis of virtual hosts you just need to inspect req.http.host. You can have something like this: sub vcl_recv { if (req.http.host ~ "foo.com") { set req.backend_hint = foo; } elsif (req.http.host ~ "bar.com") { set req.backend_hint = bar; } }
  • 30. Note that the first regular expressions will match "foo.com", "www.foo.com", "zoop.foo.com" and any other host ending in "foo.com". In this example this is intentional but you might want it to be a bit more tight, maybe relying on the == operator in stead, like this: sub vcl_recv { if (req.http.host == "foo.com" || req.http.host == "www.foo.com") { set req.backend_hint = foo; } } Directors You can also group several backend into a group of backends. These groups are called directors. This will give you increased performance and resilience. You can define several backends and group them together in a director. This requires you to load a VMOD, a Varnish module, and then to call certain actions in vcl_init.: import directors; # load the directors backend server1 { .host = "192.168.0.10"; } backend server2 { .host = "192.168.0.10"; } sub vcl_init { new bar = directors.round_robin(); bar.add_backend(server1); bar.add_backend(server2); } sub vcl_recv { # send all traffic to the bar director: set req.backend_hint = bar.backend(); } This director is a round-robin director. This means the director will distribute the incoming requests on a round-robin basis. There is also a random director which distributes requests in a, you guessed it, random fashion. If that is not
  • 31. enough, you can also write your own director (see Writing a Director). But what if one of your servers goes down? Can Varnish direct all the requests to the healthy server? Sure it can. This is where the Health Checks come into play. Health checks Lets set up a director with two backends and health checks. First let us define the backends: backend server1 { .host = "server1.example.com"; .probe = { .url = "/"; .timeout = 1s; .interval = 5s; .window = 5; .threshold = 3; } } backend server2 { .host = "server2.example.com"; .probe = { .url = "/"; .timeout = 1s; .interval = 5s; .window = 5; .threshold = 3; } } What is new here is the probe. In this example Varnish will check the health of each backend every 5 seconds, timing out after 1 second. Each poll will send a GET request to /. If 3 out of the last 5 polls succeeded the backend is considered healthy, otherwise it will be marked as sick. Refer to the Probes section in the VCL documentation for more information. Now we define the 'director': import directors; sub vcl_init {
  • 32. new vdir = directors.round_robin(); vdir.add_backend(server1); vdir.add_backend(server2); } You use this vdir director as a backend_hint for requests, just like you would with a simple backend. Varnish will not send traffic to hosts that are marked as unhealthy. Varnish can also serve stale content if all the backends are down. See Misbehaving servers for more information on how to enable this. Please note that Varnish will keep health probes running for all loaded VCLs. Varnish will coalesce probes that seem identical - so be careful not to change the probe config if you do a lot of VCL loading. Unloading the VCL will discard the probes. For more information on how to do this please see ref:reference-vcl-director.
  • 33. changing one s server headers is both practical and fun. It s a good idea to remove information that ’ ’ could help an attacker, and it s also enjoyable to put interesting values in there and see who notices. ’ There are tons of ways of doing this, based on the server you use, but here s a way to do it with ’ Varnish. Editing default.vcl In Varnish, your default.vcl file contains the rules that govern your server responses. The vcl_deliver section further defines what goes out to clients. By adjusting this section you can strip the values that were set by your backend web server, and substitute your own: sub vcl_deliver { remove resp.http.Via; remove resp.http.X-Whatever; remove resp.http.X-Powered-By; remove resp.http.X-Varnish; remove resp.http.Age; remove resp.http.Server; set resp.http.Server = "TFE"; set resp.http.X-Powered-By = "Curiosity"; }