บ้าน ซอฟต์แวร์ วานิช: เตรียมที่จะเฉือน!

วานิช: เตรียมที่จะเฉือน!

สารบัญ:

Anonim

เมื่อพูดถึงประสิทธิภาพของเว็บไซต์วานิชเป็นเทคโนโลยีสุดฮอต ด้วยการติดตั้งและการกำหนดค่าที่เรียบง่ายจึงเป็นไปได้ที่จะเพิ่มประสิทธิภาพของเว็บไซต์ใด ๆ และแสดงผลได้มากถึงล้านหน้าด้วยเซิร์ฟเวอร์เสมือนส่วนตัวขนาดเล็กเท่านั้น ฉันจะแสดงการกำหนดค่าที่เป็นไปได้สี่แบบที่จะช่วยคุณปรับปรุงเวลาตอบสนองของไซต์ของคุณไม่ว่าคุณจะให้บริการหน้าเว็บหลายร้อยพันหรือล้านหน้า

น้ำยาวานิชเบื้องต้น

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 หรือเว็บไซต์ที่กำหนดเองคุณต้องเปลี่ยนกฎเหล่านี้ แต่เป้าหมายจะเหมือนเดิมเสมอ: ในการส่งเพจไดนามิกและแคชทั้งหมดที่คุณสามารถทำได้ที่ด้านหลังของคุณ

มาตรฐาน ++: เพิ่มความยืดหยุ่นของเซิร์ฟเวอร์

บางครั้งเว็บเซิร์ฟเวอร์ช้าเพราะมีโหลดสูง วานิชก็สามารถช่วยได้เช่นกัน เราสามารถใช้คำสั่งพิเศษเพื่อบอกวานิชเพื่อหลีกเลี่ยงการพูดคุยกับแบ็คเอนด์ถ้ามันลงหรือตอบช้าเกินไป สำหรับกรณีเหล่านี้วานิชใช้คำสั่ง "พระคุณ"


ความสง่างามในขอบเขตของวานิชหมายถึงการส่งมอบวัตถุที่หมดอายุเป็นอย่างอื่นเมื่อสถานการณ์เรียกร้อง สิ่งนี้สามารถเกิดขึ้นได้เนื่องจาก:

  • ผู้กำกับด้านหลังที่เลือกนั้นหยุดทำงาน
  • เธรดอื่นได้ทำการร้องขอไปยังส่วนหลังที่ยังไม่เสร็จสิ้น
ทั้งสองกรณีได้รับการจัดการเหมือนกันใน 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 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;

}

เครื่องมืออันทรงพลัง

นี่เป็นเพียงตัวอย่างที่ช่วยให้คุณเริ่มต้นใช้งานวานิช เครื่องมือนี้มีประสิทธิภาพมากและสามารถช่วยให้คุณเพิ่มประสิทธิภาพได้อย่างยอดเยี่ยมโดยไม่ต้องซื้อฮาร์ดแวร์หรือเครื่องเสมือนเพิ่มเติม สำหรับผู้ดูแลเว็บไซต์หลายคนนั่นเป็นประโยชน์อย่างแท้จริง

วานิช: เตรียมที่จะเฉือน!