สารบัญ:
- น้ำยาวานิชเบื้องต้น
- พื้นฐาน: รูปภาพแคช
- มาตรฐาน: รูปภาพแคชและหน้า
- มาตรฐาน ++: เพิ่มความยืดหยุ่นของเซิร์ฟเวอร์
- การใช้งานขั้นสูง: สร้างเว็บเซิร์ฟเวอร์ที่ยืดหยุ่นในสภาพแวดล้อมแบบกระจาย
- เครื่องมืออันทรงพลัง
เมื่อพูดถึงประสิทธิภาพของเว็บไซต์วานิชเป็นเทคโนโลยีสุดฮอต ด้วยการติดตั้งและการกำหนดค่าที่เรียบง่ายจึงเป็นไปได้ที่จะเพิ่มประสิทธิภาพของเว็บไซต์ใด ๆ และแสดงผลได้มากถึงล้านหน้าด้วยเซิร์ฟเวอร์เสมือนส่วนตัวขนาดเล็กเท่านั้น ฉันจะแสดงการกำหนดค่าที่เป็นไปได้สี่แบบที่จะช่วยคุณปรับปรุงเวลาตอบสนองของไซต์ของคุณไม่ว่าคุณจะให้บริการหน้าเว็บหลายร้อยพันหรือล้านหน้า
น้ำยาวานิชเบื้องต้น
Varnish-Cache เป็นตัวเร่งความเร็วเว็บที่มีเป้าหมายในการแคชเนื้อหาเว็บไซต์ เป็นโครงการโอเพนซอร์ซที่มีจุดมุ่งหมายเพื่อเพิ่มประสิทธิภาพและเพิ่มความเร็วในการเข้าถึงเว็บไซต์ที่ไม่มีการบุกรุกโดยไม่ต้องเปลี่ยนรหัส
มันเป็นผู้สร้าง Varnish Cache ที่เรียกมันว่า Web Accelerator เพราะวัตถุประสงค์หลักของมันคือการปรับปรุงและเพิ่มความเร็วให้กับส่วนหน้าของเว็บไซต์ วานิชทำได้โดยการเก็บสำเนาของหน้าที่ให้บริการโดยเว็บเซิร์ฟเวอร์ในแคช ในครั้งต่อไปที่มีการร้องขอหน้าเดียวกันวานิชจะให้บริการสำเนาแทนการร้องขอหน้าจากเว็บเซิร์ฟเวอร์ส่งผลให้ประสิทธิภาพเพิ่มขึ้นอย่างมาก
คุณสมบัติที่สำคัญอีกประการหนึ่งของ Varnish Cache นอกเหนือจากประสิทธิภาพของมันคือความยืดหยุ่นของภาษาการกำหนดค่า VCL VCL ทำให้สามารถเขียนนโยบายเกี่ยวกับวิธีจัดการคำขอที่เข้ามาได้ ในนโยบายดังกล่าวคุณสามารถตัดสินใจได้ว่าเนื้อหาใดที่คุณต้องการให้แสดงจากที่ที่คุณต้องการรับเนื้อหาและวิธีการเปลี่ยนคำขอหรือการตอบสนอง
ในตัวอย่างของการกำหนดค่าต่อไปนี้ฉันจะแสดงให้คุณเห็นว่ากฎ VCL ใดที่จะใช้เพื่อให้บรรลุเป้าหมายบางอย่างตั้งแต่การแคชรูปภาพและวัตถุคงที่ไปจนถึงการใช้ Varnish ในสภาพแวดล้อมแบบกระจายหรือทำให้มันเป็น load balancer
ตัวอย่างทั้งหมดต่อไปนี้สำหรับวานิช 3.x โปรดทราบว่าวานิช 2.x ใช้ไวยากรณ์และกฎที่ต่างกันดังนั้นตัวอย่างเหล่านี้ไม่สามารถใช้ร่วมกับเวอร์ชันนั้นได้
ต่อไปนี้เป็นสถานะหลักของ Varnish ซึ่งเราจะใช้ในไฟล์กำหนดค่า VCL:
recv
นี่เป็นฟังก์ชั่นแรกที่เรียกว่าเมื่อได้รับการร้องขอ ที่นี่เราสามารถจัดการคำขอก่อนที่จะไปตรวจสอบว่ามีอยู่ในแคช หากไม่สามารถใส่คำขอลงในแคชเซิร์ฟเวอร์ด้านหลังที่จะส่งคำขอสามารถเลือกได้ในขั้นตอนนี้
ผ่านไป
เราสามารถใช้ฟังก์ชั่นนี้เมื่อเราต้องการส่งคำขอไปยังเว็บเซิร์ฟเวอร์และแคชคำตอบ
ท่อ
ฟังก์ชันนี้ข้ามการเคลือบเงาและส่งการร้องขอไปยังเว็บเซิร์ฟเวอร์
ค้นหา
ด้วยการค้นหาวานิชขอให้ตรวจสอบว่ามีการตอบสนองและมีอยู่ในแคชหรือไม่
นำมา
ฟังก์ชั่นนี้เรียกว่าหลังจากการกู้คืนเนื้อหาจากแบ็คเอนด์ถูกเรียกโดยผ่านหรือพลาด
พื้นฐาน: รูปภาพแคช
ลองดูตัวอย่างของการตั้งค่า ในตัวอย่างแรกนี้เราจะเพียงแค่แคชรูปภาพและไฟล์สแตติกเช่นไฟล์ 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 สตริงจะเป็นตำแหน่ง "พิเศษ" ที่ใช้ในการเข้าสู่ระบบ Wordpress ในฐานะผู้ดูแลระบบ ดังนั้นเราต้องการพูดคุยโดยตรงกับเว็บเซิร์ฟเวอร์และหลีกเลี่ยงแคชวานิช
โดยปกติหากคุณใช้ Drupal, Joomla หรือเว็บไซต์ที่กำหนดเองคุณต้องเปลี่ยนกฎเหล่านี้ แต่เป้าหมายจะเหมือนเดิมเสมอ: ในการส่งเพจไดนามิกและแคชทั้งหมดที่คุณสามารถทำได้ที่ด้านหลังของคุณ
มาตรฐาน ++: เพิ่มความยืดหยุ่นของเซิร์ฟเวอร์
บางครั้งเว็บเซิร์ฟเวอร์ช้าเพราะมีโหลดสูง วานิชก็สามารถช่วยได้เช่นกัน เราสามารถใช้คำสั่งพิเศษเพื่อบอกวานิชเพื่อหลีกเลี่ยงการพูดคุยกับแบ็คเอนด์ถ้ามันลงหรือตอบช้าเกินไป สำหรับกรณีเหล่านี้วานิชใช้คำสั่ง "พระคุณ"
ความสง่างามในขอบเขตของวานิชหมายถึงการส่งมอบวัตถุที่หมดอายุเป็นอย่างอื่นเมื่อสถานการณ์เรียกร้อง สิ่งนี้สามารถเกิดขึ้นได้เนื่องจาก:
- ผู้กำกับด้านหลังที่เลือกนั้นหยุดทำงาน
- เธรดอื่นได้ทำการร้องขอไปยังส่วนหลังที่ยังไม่เสร็จสิ้น
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 s", "1230 ms" หรือแม้แต่ "1 ชั่วโมง"
.interval
ระยะเวลารอระหว่างการสำรวจความคิดเห็น คุณต้องระบุหน่วยเวลาที่นี่ด้วย ขอให้สังเกตว่านี่ไม่ใช่ "อัตรา" แต่เป็น "ช่วง" อัตราการสำรวจความคิดเห็นต่ำสุดคือ (.timeout + .interval)
.หน้าต่าง
จำนวนโพลล่าสุดที่ควรพิจารณาเมื่อพิจารณาว่าส่วนท้ายมีประโยชน์หรือไม่
.threshold
จำนวนโพลล่าสุดที่ได้รับจะต้องดีต่อท้ายหลังเพื่อให้มีสุขภาพที่ดี
ตอนนี้เราสามารถใช้คำสั่ง "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;
}
เครื่องมืออันทรงพลัง
นี่เป็นเพียงตัวอย่างที่ช่วยให้คุณเริ่มต้นใช้งานวานิช เครื่องมือนี้มีประสิทธิภาพมากและสามารถช่วยให้คุณเพิ่มประสิทธิภาพได้อย่างยอดเยี่ยมโดยไม่ต้องซื้อฮาร์ดแวร์หรือเครื่องเสมือนเพิ่มเติม สำหรับผู้ดูแลเว็บไซต์หลายคนนั่นเป็นประโยชน์อย่างแท้จริง