بيت البرمجيات الورنيش: تستعد لتكون مائلة!

الورنيش: تستعد لتكون مائلة!

جدول المحتويات:

Anonim

عندما يتعلق الأمر بأداء موقع الويب ، فإن تقنية الورنيش هي تقنية ساخنة. من خلال التثبيت والتكوين البسيط ، من الممكن تحسين أداء أي موقع ويب وخدمة ما يصل إلى مليون صفحة باستخدام خادم خاص افتراضي صغير فقط. ، سأريك أربعة تكوينات ممكنة ستساعدك في تحسين وقت استجابة موقعك ، سواء كنت تخدم المئات أو الآلاف أو ملايين الصفحات.

مقدمة للورنيش

Varnish-Cache عبارة عن مسرع ويب بهدف تخزين محتوى موقع الويب في ذاكرة التخزين المؤقت. إنه مشروع مفتوح المصدر يهدف إلى تحسين وتسريع الوصول إلى المواقع بشكل غير مباشر - دون تغيير الكود - ويسمح لك بوضع يديك على موقع الويب الخاص بك.


كان منشئو شركة Varnish Cache الذين أطلقوا عليها اسم مسرع الويب ، لأن هدفها الأساسي هو تحسين وتسريع الواجهة الأمامية لموقع الويب. يحقق الورنيش ذلك عن طريق تخزين نسخ من الصفحات التي يقدمها خادم الويب في ذاكرة التخزين المؤقت الخاصة به. في المرة التالية التي يتم فيها طلب نفس الصفحة ، ستقوم Varnish بعرض النسخة بدلاً من طلب الصفحة من خادم الويب ، مما يؤدي إلى زيادة هائلة في الأداء.


من الميزات الرئيسية لبرنامج Varnish Cache ، بالإضافة إلى أدائه ، مرونة لغة التكوين الخاصة به ، VCL. يجعل VCL من الممكن كتابة سياسات حول كيفية معالجة الطلبات الواردة. في مثل هذه السياسة ، يمكنك تحديد المحتوى الذي تريد عرضه ، ومن المكان الذي ترغب في الحصول على المحتوى فيه ، وكيف يجب تغيير الطلب أو الاستجابة.


في الأمثلة التالية من التكوين ، سأريكم قواعد VCL التي يجب استخدامها لتحقيق بعض الأهداف ، من التخزين المؤقت البسيط للصور والكائنات الساكنة ، إلى استخدام الورنيش في بيئة موزعة أو جعله بمثابة موازن تحميل.


جميع الأمثلة التالية خاصة بـ Varnish 3.x. يرجى ملاحظة أن Varnish 2.x يستخدم بناء جملة وقواعد مختلفة ، لذلك هذه الأمثلة غير متوافقة مع هذا الإصدار.


فيما يلي الحالات الرئيسية لـ Varnish ، والتي سنستخدمها في ملف تكوين VCL:


ريكف

هذه هي الوظيفة الأولى التي يتم استدعاؤها عند تلقي طلب. يمكننا هنا معالجة الطلب قبل الانتقال للتحقق مما إذا كان موجودًا في ذاكرة التخزين المؤقت. إذا تعذر وضع طلب في ذاكرة تخزين مؤقت ، فيمكن أيضًا اختيار خادم الخلفية الذي سيتم إرسال الطلب إليه في هذه المرحلة.


البشري

يمكننا استخدام هذه الوظيفة عندما نريد تمرير الطلب إلى خادم الويب وتخزين الإجابة مؤقتًا.


يضخ

تتجاوز هذه الوظيفة الورنيش وترسل الطلب إلى خادم الويب.


ابحث عن

من خلال البحث ، يطلب Varnish التحقق مما إذا كانت الاستجابة موجودة وصحيحة في ذاكرة التخزين المؤقت.


جلب

تُسمى هذه الوظيفة بعد استدعاء المحتوى من النهاية الخلفية بتمريرة أو ملكة جمال.

الأساسيات: صور ذاكرة التخزين المؤقت

لذلك دعونا ننظر إلى مثال التكوين. في هذا المثال الأول ، سنقوم فقط بتخزين الصور والملفات الثابتة مثل ملفات CSS. هذا التكوين مفيد حقًا عندما لا تعرف موقع الويب الذي ترغب في تعزيزه ، لذلك يمكنك فقط أن تقرر أن جميع الصور و CSS و JavaScript هي نفسها لجميع المستخدمين. من أجل التمييز بين المستخدمين ، يستخدم بروتوكول HTTP ملفات تعريف الارتباط ، لذلك يتعين علينا التخلص منها في هذا النوع من الطلبات حتى تكون جميعها متماثلة بالنسبة للورنيش:

sub vcl_recv{


if(req.url ~ " * \.(png|gif|jpg|swf|css|js)"{

unset req.http.cookie;


unset req.http.Vary;

return(lookup);

}


# strip the cookie before the image is inserted into cache.

sub vcl_fetch {

if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") {

unset beresp.http.set-cookie;

}

وهذا كل شيء. باستخدام ملف VCL ، يمكنك تخزين محتوى ثابت بسهولة.

المعيار: الصور والذاكرة المؤقتة

عادةً ، لا ترغب فقط في تخزين المحتويات الثابتة لموقع الويب الخاص بك ولكنك ترغب أيضًا في تخزين بعض الصفحات الديناميكية التي يتم إنشاؤها بواسطة خادم الويب الخاص بك ، ولكن هذه هي نفسها لجميع المستخدمين - أو على الأقل لجميع المستخدمين المجهولين المستخدمين. في هذه المرحلة ، يجب أن تعرف اختيار الصفحات التي يمكن تخزينها مؤقتًا وأيها لا يمكن.


مثال جيد على ذلك هو Wordpress ، أحد أكثر أنظمة إدارة المحتوى شيوعًا. يقوم Wordpress بإنشاء صفحات الموقع بشكل ديناميكي باستخدام PHP والاستعلامات إلى قاعدة بيانات MySQL. هذا جميل لأنه يمكنك بسهولة تحديث موقع الويب الخاص بك من واجهة الإدارة ببضع نقرات ، لكنه أيضًا مكلف من حيث الموارد المستخدمة. لماذا يتم تشغيل نفس البرنامج النصي PHP واستعلام MySQL في كل مرة يهبط فيها المستخدم على الصفحة الرئيسية؟ يمكننا استخدام الورنيش للتخزين المؤقت للصفحات الأكثر زيارة وتحقيق نتائج مذهلة.


هذه بعض القواعد التي يمكن أن تكون مفيدة في تثبيت Wordpress:

sub vcl_recv{

# Let's make sure we aren't compressing already compressed formats.

if (req.http.Accept-Encoding) {

if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?. * |)$") {

remove req.http.Accept-Encoding;

} elsif (req.http.Accept-Encoding ~ "gzip") {

set req.http.Accept-Encoding = "gzip";

} elsif (req.http.Accept-Encoding ~ "deflate") {

set req.http.Accept-Encoding = "deflate";

} else {

remove req.http.Accept-Encoding;

}

}


if (req.url ~ "^/$") {

unset req.http.cookie;

}


# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


}


sub vcl_miss {

if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

}

if (req.url ~ "^/+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {

unset req.http.cookie;

set req.url = regsub(req.url, "\?.$", "");

}

if (req.url ~ "^/$") {

unset req.http.cookie;

}

}

sub vcl_fetch {

if (req.url ~ "^/$") {

unset beresp.http.set-cookie;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail

if (!(req.url ~ "wp-(login| admin )")) {

unset beresp.http.set-cookie;

}

}

يمكنك أن ترى أنه في هذا المثال ، نقوم بتخزين جميع الصفحات من موقعنا على الويب ، ولكن بالنسبة للصفحات التي تحتوي على "wp- admin" أو "wp-login" في عنوان url ، فإن السلاسل هي مواقع "خاصة" تستخدم لتسجيل الدخول إلى وورد كمسؤول. على هذا النحو ، نريد التحدث مباشرة إلى خادم الويب وتجاوز ذاكرة التخزين المؤقت الورنيش.


بطبيعة الحال ، إذا كنت تستخدم Drupal أو Joomla أو موقع ويب مخصص ، فيجب عليك تغيير هذه القواعد ، لكن الهدف دائمًا هو نفسه: لإرسال جميع الصفحات الديناميكية وذاكرة التخزين المؤقت إلى النهاية الخلفية.

المعيار ++: زيادة مرونة الخادم

خوادم الويب في وقت ما تصبح بطيئة لأن لديها حمولة عالية. يمكن أن يساعد الورنيش في هذا أيضًا. يمكننا استخدام بعض التوجيهات الخاصة لإخبار الورنيش لتجنب التحدث مع النهاية الخلفية إذا كان تعطلًا أو كان الرد ببطء شديد. لهذه الحالات ، يستخدم الورنيش توجيه "النعمة".


نعمة نطاق الورنيش تعني إيصال أشياء منتهية الصلاحية عندما تتطلب الظروف ذلك. يمكن أن يحدث هذا بسبب:

  • المدير الخلفي المحدد متوقف
  • قام مؤشر ترابط مختلف بالفعل بتقديم طلب إلى النهاية الخلفية لم ينته بعد.
يتم التعامل مع كلتا الحالتين في VCL:

sub vcl_recv {

if (req.backend.healthy) {

set req.grace = 30s;

} else {

set req.grace = 1h;

}

}


sub vcl_fetch {

set beresp.grace = 1h;

}

يطلب هذا التكوين من الورنيش اختبار النهاية الخلفية ورفع فترة السماح إذا كان لديه بعض المشاكل. يقدم المثال أعلاه أيضًا التوجيه "req.backend.healthy" ، والذي يُستخدم للتحقق من النهاية الخلفية. هذا مفيد حقًا عندما يكون لديك نهايات خلفية متعددة ، لذلك دعونا نلقي نظرة على مثال أكثر تقدمًا.

الاستخدام المتقدم: إنشاء خادم ويب مرن في بيئة موزعة

هذا هو ملف التكوين النهائي الخاص بنا مع كل الخيارات التي رأيناها حتى الآن ، وينتهي تعريف اثنين من الخلف ببعض التوجيه الخاص للمسبار. هذه هي الطريقة التي يحدد بها الورنيش ما إذا كان خادم الويب حيًا أم لا.


.url

سيقدم الورنيش طلبات إلى النهاية الخلفية بعنوان URL هذا.


.نفذ الوقت

يحدد مدى سرعة الانتهاء من التحقيق. يجب عليك تحديد وحدة زمنية برقم ، مثل "0.1 ثانية" أو "1230 مللي ثانية" أو حتى "ساعة واحدة".


.فترة

كم من الوقت للانتظار بين صناديق الاقتراع. يجب عليك تحديد وحدة زمنية هنا أيضا. لاحظ أن هذا ليس "معدل" بل "فاصل". أدنى معدل استطلاع هو (.timeout +. interval).


.نافذة او شباك

كم من أحدث استطلاعات الرأي يجب مراعاتها عند تحديد ما إذا كانت النهاية الخلفية صحية.


.عتبة

كم من استطلاعات الرأي الأخيرة .window يجب أن تكون جيدة حتى يتم إعلان النهاية الخلفية بصحة جيدة.


الآن يمكننا استخدام التوجيه "req.backend.healthy" والحصول على نتيجة منطقية تخبرنا ما إذا كانت النهاية (النهاية) الخلفية على قيد الحياة أم لا.

#

# Customized VCL file for serving up a Wordpress site with multiple back-ends.

#


# Define the internal network subnet.

# These are used below to allow internal access to certain files while not

# allowing access from the public internet .

acl internal {

"10.100.0.0"/24;

}


# Define the list of our backends (web servers), they Listen on port 8080


backend web1 { .host = "10.100.0.1"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}

backend web2 { .host = "10.100.0.2"; .port = "8080"; .probe = { .url = "/status.php"; .interval = 5s; .timeout = 1s; .window = 5;.threshold = 3; }}


# Define the director that determines how to distribute incoming requests.

director default_director round-robin {

{ .backend = web1; }

{ .backend = web2; }

}


# Respond to incoming requests.

sub vcl_recv {


set req.backend = default_director;

# Use anonymous, cached pages if all backends are down.

if (!req.backend.healthy) {

unset req.http.Cookie;

set req.grace = 6h;

} else {

set req.grace = 30s;

}

# Unset all cookies if not Wordpress admin - otherwise login will fail


if (!(req.url ~ "wp-(login| admin )")) {

unset req.http.cookie;

return(lookup);

}


# If you request the special pages go directly to them


if (req.url ~ "wp-(login| admin )") {

return (pipe);

}


# Always cache the following file types for all users.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

unset req.http.Cookie;

}


}


# Code determining what to do when serving items from the web servers.

sub vcl_fetch {

# Don't allow static files to set cookies.

if (req.url ~ "(?i)\.(png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?+)?$") {

# beresp == Back-end response from the web server.

unset beresp.http.set-cookie;

}


# Allow items to be stale if needed.

set beresp.grace = 6h;

}

أداة قوية

هذه فقط بعض الأمثلة التي يمكن أن تساعدك على البدء في استخدام الورنيش. هذه الأداة قوية حقًا ويمكن أن تساعدك في تحقيق زيادة كبيرة في الأداء دون شراء المزيد من الأجهزة أو الأجهزة الافتراضية. بالنسبة للعديد من مسؤولي الموقع ، هذه فائدة حقيقية.

الورنيش: تستعد لتكون مائلة!