תוכן עניינים:
- מבוא לכה
- היסודות: תמונות מטמון
- התקן: תמונות ועמודים של מטמון
- התקן ++: הגדל את חוסן השרת
- שימוש מתקדם: צור שרת אינטרנט עמיד בסביבה מבוזרת
- כלי רב עוצמה
כשמדובר בביצועי אתר, לכה היא טכנולוגיה חמה. בעזרת התקנה וקונפיגורציה פשוטים ניתן לשפר את הביצועים של כל אתר ולהגיש עד מיליון עמודים עם שרת פרטי וירטואלי קטן בלבד., אני אראה לך ארבע תצורות אפשריות שיעזרו לך לשפר את זמן התגובה של האתר שלך, בין אם אתה משרת מאות, אלפי או מיליוני עמודים.
מבוא לכה
Varnish-Cache הוא מאיץ אינטרנט שמטרתו לשמור תוכן לאתר. זהו פרויקט קוד פתוח שמטרתו לייעל ולהאיץ את הגישה לאתרים באופן לא פולשני - מבלי לשנות את הקוד - ולאפשר לכם להכניס את הידיים לאתר שלכם.
היוצרים של Varnish Cache הם שקראו לזה מאיץ רשת, מכיוון שמטרתו העיקרית היא לשפר ולהאיץ את חזית האתר. לכה משיגה זאת על ידי אחסון עותקים של הדפים המוגשים על ידי שרת האינטרנט בזיכרון המטמון שלה. בפעם הבאה שאותו דף יתבקש, Varnish תגיש את העותק במקום לבקש את הדף משרת האינטרנט, וכתוצאה מכך תגבור ביצועים אדיר.
אחת מתכונות המפתח של Varnish Cache, בנוסף לביצועיה, היא הגמישות של שפת התצורה שלה, VCL. VCL מאפשר לכתוב מדיניות לגבי אופן הטיפול בקשות נכנסות. במדיניות כזו אתה יכול להחליט איזה תוכן תרצה להגיש, מהיכן אתה רוצה להשיג את התוכן ואיך יש לשנות את הבקשה או התגובה.
בדוגמאות הבאות לתצורה, אראה באילו כללי VCL להשתמש בכדי להשיג מטרות מסוימות, החל מטמון פשוט של תמונות ואובייקטים סטטיים, וכלה בשימוש בלכה בסביבה מבוזרת או שמא ישמש אותה כמאזן עומסים.
כל הדוגמאות הבאות מיועדות ל- Varnish 3.x. שימו לב ש- Varnish 2.x משתמש בתחביר וכללים שונים, לכן דוגמאות אלה אינן תואמות לגירסה זו.
להלן המדינות העיקריות של Varnish, בהן נשתמש בקובץ התצורה של VCL:
recv
זו הפונקציה הראשונה הנקראת בעת קבלת בקשה. כאן אנו יכולים לתפעל את הבקשה לפני שנלך לבדוק אם היא קיימת במטמון. אם לא ניתן להכניס בקשה למטמון, ניתן לבחור גם בשרת האחורי שאליו תישלח הבקשה בשלב זה.
לעבור
אנו יכולים להשתמש בפונקציה זו כאשר אנו רוצים להעביר את הבקשה לשרת האינטרנט ולשמור את התשובה במטמון.
צינור
פונקציה זו עוקפת את לכה ושולחת את הבקשה לשרת האינטרנט.
הבט מעלה
במבט אחר, Varnish מבקש לאמת אם התגובה קיימת ותקפה במטמון.
להביא
פונקציה זו נקראת לאחר שחזור התוכן מהקצה האחורי מופעל על ידי מעבר או פספוס.
היסודות: תמונות מטמון
אז בואו נראה דוגמה לתצורה. בדוגמה ראשונה זו, אנו פשוט נשמור את התמונות ואת הקבצים הסטטיים במטמון כמו קבצי CSS. תצורה זו ממש שימושית כאשר אינך מכיר את האתר שאתה רוצה לשפר, כך שתוכל פשוט להחליט שכל התמונות, CSS ו- JavaScript זהים לכל המשתמשים. כדי להבדיל בין משתמשים, פרוטוקול HTTP משתמש בעוגיות, ולכן עלינו לחסל אותם בסוג זה של בקשה כך שכולם זהים עבור Varnish:
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, אחת ממערכות ניהול התוכן הנפוצות ביותר. וורדפרס מייצרת דפי אתרים באופן דינמי עם 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 המיתרים הם מיקומים "מיוחדים" המשמשים בכניסה לחשבון Wordpress כמנהל. ככאלה, אנו רוצים לדבר ישירות עם שרת האינטרנט ולעקוף את המטמון של לכה.
באופן טבעי, אם אתה משתמש בדרופל, ג'ומלה או באתר בהזמנה אישית, עליך לשנות את הכללים האלה, אך המטרה היא תמיד זהה: לשלוח את כל הדפים הדינמיים והמטמון שאתה יכול לקצה האחורי.
התקן ++: הגדל את חוסן השרת
מתישהו שרתי האינטרנט הופכים לאיטיים מכיוון שיש להם עומס גבוה. לכה יכולה לעזור גם בזה. אנו יכולים להשתמש בכמה הנחיות מיוחדות כדי לומר לווארש להימנע משיחה עם הקצה האחורי אם הוא מושבת או עונה לאט מדי. במקרים אלה לכה משתמשת בהנחיית "החסד".
חסד בהיקף לכה פירושו מסירת חפצים שפג תוקפם אחרת כאשר הנסיבות דורשות זאת. זה יכול לקרות בגלל:
- הבמאי האחורי שנבחר אינו פעיל
- שרשור אחר כבר הגיש בקשה לקצה האחורי שטרם הסתיים.
sub vcl_recv {
if (req.backend.healthy) {
set req.grace = 30s;
} else {
set req.grace = 1h;
}
}
sub vcl_fetch {
set beresp.grace = 1h;
}
תצורה זו אומרת ל- Varnish לבדוק את הקצה האחורי ולהעלות את תקופת החסד אם יש לו בעיות. הדוגמה לעיל מציגה גם את ההנחיה "req.backend.healthy", המשמשת לבדיקת קצה אחורי. זה ממש שימושי כשיש לך מספר קצוות אחוריים, אז בואו נסתכל על דוגמה מתקדמת יותר.
שימוש מתקדם: צור שרת אינטרנט עמיד בסביבה מבוזרת
זהו קובץ התצורה הסופי שלנו עם כל האפשרויות שראינו עד כה וההגדרה של שני קצוות אחוריים עם איזושהי הנחיה מיוחדת לגשש. כך קובעת Varnish אם שרת אינטרנט חי או לא.
.ורל
לכה תגיש בקשות לקצה האחורי באמצעות כתובת אתר זו.
.פסק זמן
קובע כמה מהר צריך לגמור את הגשושית. עליך לציין יחידת זמן עם מספר, כגון "0.1 שניות", "1230 ms" או אפילו "1 h".
מרווח
כמה זמן לחכות בין הסקרים. עליך לציין גם יחידת זמן כאן. שימו לב שזה לא "קצב" אלא "מרווח". שיעור הסקרים הנמוך ביותר הוא (. Timeout +. Interval).
חלון
כמה מהסקרים האחרונים שיש לקחת בחשבון בעת קביעת האם הצד האחורי בריא.
.מפתן
כמה מהסקרים האחרונים שעשו חלון חייבים להיות טובים בכדי להכריז על הבריאות.
כעת נוכל להשתמש בהנחיה "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;
}
כלי רב עוצמה
אלה רק כמה דוגמאות שיכולות לעזור לך להתחיל להשתמש בלכה. כלי זה הוא באמת חזק ויכול לעזור לך להשיג דחיפה ביצועים נהדרת מבלי לקנות יותר חומרה או מכונות וירטואליות. עבור מנהלי אתרים רבים זה יתרון אמיתי.