ทำไมแคชไฟล์แบบคงที่กับวานิชทำไมไม่ผ่าน


9

ฉันมีระบบเหลืออยู่ nginx / php-fpm / varnish / wordpress และ amazon s3

ตอนนี้ฉันได้ดูไฟล์การกำหนดค่าจำนวนมากในขณะที่ตั้งค่าระบบและในทุกไฟล์ฉันพบสิ่งนี้:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

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

ฉันรู้สึกดีกว่าที่จะแคชเฉพาะไฟล์ไดนามิกเพื่อให้ php-fpm / mysql ไม่ได้รับผลกระทบมากนัก

ฉันถูกต้องหรือว่าฉันพลาดบางสิ่งที่นี่?

UPDATE

ฉันต้องการเพิ่มข้อมูลลงในคำถามตามคำตอบที่ได้รับ

หากคุณมีเว็บไซต์แบบไดนามิกที่เนื้อหามีการเปลี่ยนแปลงมากจริง ๆ การ chaching ก็ไม่สมเหตุสมผล แต่ถ้าคุณใช้ WordPress สำหรับเว็บไซต์คงที่เช่นนี้สามารถเก็บไว้เป็นเวลานาน

ที่กล่าวว่าสิ่งที่สำคัญมากให้ฉันเป็นconent แบบคงที่ ฉันพบลิงค์ที่มีการทดสอบและการวัดประสิทธิภาพของแคชแอพและเว็บเซิร์ฟเวอร์แอปต่างๆ

http://nbonvin.wordpress.com/2011/03/14/apache-vs-nginx-vs-varnish-vs-gwan/

NginX เร็วกว่าการรับเนื้อหาคงที่ของคุณดังนั้นจึงเหมาะสมกว่าที่จะปล่อยให้ผ่านไป NginX ใช้งานได้ดีกับไฟล์คงที่

-

นอกเหนือจากนั้นเนื้อหาสแตติกส่วนใหญ่ไม่ได้อยู่ในเว็บเซิร์ฟเวอร์เอง เวลาส่วนใหญ่เนื้อหานี้จัดเก็บใน CDN บางแห่งอาจ AWS S3 เป็นอย่างนั้น ฉันคิดว่าแคชวานิชเป็นที่สุดท้ายที่คุณต้องการให้คุณจัดเก็บเนื้อหาสแตติก

คำตอบ:


10

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

บทความที่เชื่อมโยงไม่ทนคนส่วนใหญ่จะแนะนำว่าวานิชทำงานได้ดีกว่า Nginx หากการติดตั้งอย่างถูกต้อง - แม้ว่า (และฉันเกลียดที่จะยอมรับมัน) - การทดสอบของฉันเองดูเหมือนจะเห็นพ้องกันว่า nginx สามารถให้บริการไฟล์คงที่เร็วกว่าวานิช โชคดีที่ฉันไม่ได้ใช้สารเคลือบเงาสำหรับจุดประสงค์นั้น) ฉันคิดว่าปัญหาคือถ้าคุณลงเอยด้วยการใช้น้ำยาเคลือบเงาคุณได้เพิ่มเลเยอร์พิเศษให้กับการตั้งค่าของคุณ การส่งผ่านเลเยอร์พิเศษนั้นไปยังเซิร์ฟเวอร์เบื้องหลังจะช้ากว่าการให้บริการโดยตรงจากแบ็กเอนด์เสมอและนี่คือเหตุผลที่ทำให้ Varnish สามารถแคชได้เร็วขึ้น - คุณบันทึกขั้นตอน ข้อดีอื่น ๆ อยู่ที่ด้านหน้าของดิสก์ หากคุณตั้งค่าวานิชให้ใช้ malloc คุณจะไม่ต้องกดดิสก์เลยซึ่งจะทำให้กระบวนการดังกล่าวพร้อมใช้งานสำหรับกระบวนการอื่น ๆ

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

ในสถานการณ์จริงคุณอาจจัดลำดับความสำคัญการใช้หน่วยความจำของคุณ - เนื้อหาแบบไดนามิกก่อนเนื่องจากมีราคาแพงที่สุดในการสร้าง จากนั้นเนื้อหาสแตติกขนาดเล็ก (เช่น js / css) และรูปภาพสุดท้าย - คุณอาจไม่แคชสื่ออื่น ๆ ในหน่วยความจำเว้นแต่คุณจะมีเหตุผลที่ดีที่จะทำเช่นนั้น ในกรณีนี้ Varnish ที่กำลังโหลดไฟล์จากหน่วยความจำและ nginx กำลังโหลดจากดิสก์ Varnish จะทำงานได้ไม่ดี nginx (โปรดทราบว่าแคชของ nginx นั้นมีไว้สำหรับ proxying และ fastCGI เท่านั้นและตามค่าเริ่มต้นนั้นจะเป็นดิสก์ เป็นไปได้ที่จะใช้ nginx พร้อม memcached)

(รวดเร็วของฉัน - หยาบมากไม่ได้รับความน่าเชื่อถือ - การทดสอบแสดงให้เห็นว่า nginx (โดยตรง) นั้นเร็วที่สุด - ลองเรียกมันว่า 100%, วานิช (กับ malloc) ช้าลงเล็กน้อย (ประมาณ 150%) และ nginx อยู่หลังวานิช ( ด้วย pass) นั้นช้าที่สุด (ประมาณ 250%) นั่นเป็นการพูดสำหรับตัวเอง - ทั้งหมดหรือไม่มีอะไรเลย - การเพิ่มเวลาพิเศษ (และการประมวลผล) เพื่อสื่อสารกับแบ็กเอนด์เพียงแค่แนะนำว่าถ้าคุณใช้วานิชและมี RAM สำรองไว้ คุณอาจจะเพียงแค่แคชทุกอย่างที่คุณทำได้และให้บริการจากวานิชแทนที่จะส่งกลับไปยัง nginx)


ฉันชอบจุดที่คุณทำฉันเพิ่งเริ่มขุดลงไปในนี้และฉันพบว่าแปลกที่คู่มือออนไลน์ส่วนใหญ่เพียงแค่ให้คุณแคชเนื้อหาแบบคงที่กับวานิชฉันคิดว่าบางคนกำลังแคชเนื้อหาคงที่ของ MB มันเป็นความจริงสิ่งที่คุณพูดถ้ามันเป็นไฟล์เล็ก ๆ และถ้าคุณมีหน่วยความจำที่ว่างมันก็โอเค
Saif Bechan

ที่กล่าวว่าฉันไม่มีหน่วยความจำเหลือและมีไฟล์เลย์เอาต์เทมเพลตที่ฉันไม่ต้องการใส่ใน CDN ฉันแค่ต้องการมันในไดเรกทอรีแม่แบบของฉัน ฉันจะลบตัวอย่างจากการเคลือบเงาวานิชที่เก็บไว้ดังนั้นหน่วยความจำที่ฉันสามารถใช้ได้ดีกว่า ฉันชอบคำแนะนำเกี่ยวกับการตั้งค่า 3 แบบที่แตกต่างกัน ฉันคิดว่าป่วยเพียงแค่เปิดพอร์ตเพื่อ nginx โดยตรงและให้บริการไฟล์เทมเพลตจากที่นั่น มีการเคลือบเงาจัดการ HTML, nginx จัดการคงที่และถ้า nessesary php / mysql สำหรับเนื้อหาสดบางส่วน
Saif Bechan

คุณจะทราบว่าการตั้งค่า Varish จำนวนมากใช้หน่วยความจำจำนวนมาก - การตั้งค่าอย่างถูกต้องและภายใต้สถานการณ์ในชีวิตจริงฉันไม่สงสัยเลยว่าการใช้งาน nginx จะทำงานได้ไม่ดี ฉันอาจแนะนำว่ามันเป็นความยืดหยุ่นและตัวเลือกวานิชที่ทำให้มันเป็นที่นิยม - มันถูกออกแบบมาโดยเฉพาะสำหรับการแคช afterall ด้วย Wordpress การตั้งค่าที่ฉันต้องการคือ Wordpress + W3TC (+ Cloudfront) + วานิช + Nginx + PHP-FPM + APC จริง ๆ แล้วมันไม่เร็วในบางกรณีเช่นเดียวกับการตั้งค่าอื่น ๆ แต่ก็จัดการโหลดได้ค่อนข้างดีด้วยประสิทธิภาพที่ดี โปรดทราบว่าไฟร์วอลล์ขององค์กรมักจะบล็อกพอร์ตที่ไม่ได้มาตรฐาน
cyberx86

อยากรู้อยากเห็นทำไมไม่เก็บแม่แบบของคุณ (แน่นอนความหมาย CSS / JS - PHP ต้องอยู่บนเซิร์ฟเวอร์ของคุณ) ใน CDN ของคุณ? นอกจากนี้หนึ่งในอินสแตนซ์ ec2 ของฉันคือการตั้งค่าโดยคำนึงถึงหลักฐานเดียวกันและรวมถึงสิ่งต่อไปนี้: if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}ใน vcl_recv () โดยพื้นฐานแล้วฉันไม่ต้องการแคชสื่อ - แต่แน่นอนว่าต้องการแคช html (php) และแม้กระทั่ง js / css (โดยทฤษฎีแล้วว่ารูปภาพต่าง ๆ มีส่วนช่วยลดเวลาในการโหลดหน้ากระดาษที่รับรู้กว่าโครงร่าง)
cyberx86

ฉันเคยเห็น w3tc แล้ว แต่ฉันไม่ชอบใช้ปลั๊กอิน ฉันเพิ่งสร้างปลั๊กอินเล็ก ๆ ของตัวเองที่ดูแลตัวเลือกเฉพาะสำหรับแต่ละไซต์ดังนั้นฉันจึงรู้ว่าทุกอย่างทำอะไร จากโปรแกรมเมอร์ POV ฉันได้ดูปลั๊กอินบางตัวและบางอันก็ออกแบบมาอย่างน่ากลัว ฉันสร้างปลั๊กอิน minify ของตัวเองโดยตรง smushing และอัปโหลดไฟล์สื่อไปยัง s3 และ cf ปลั๊กอิน memcached ขนาดเล็กและอื่น ๆ ฉันไม่ได้มีจุดเพื่อสร้างปลั๊กอินสุดท้ายที่ดูแลการอัปโหลดแม่แบบไปยัง CDN
Saif Bechan

2

ฉันคิดว่าคุณอาจจะพลาดอะไรซักอย่าง

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

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

ขยายตรรกะนั้นไปยังสิ่งที่มีปัญหามากกว่าเช่นสิทธิ์ผู้ใช้และคุณสามารถดูได้ว่าเหตุใดเนื้อหาแบบไดนามิกจึงไม่ควรถูกแคช หากฐานข้อมูลไม่ได้รับผลกระทบจากเนื้อหาแบบไดนามิก CMS จะไม่มีวิธีพิจารณาว่าผู้ใช้ที่ร้องขอหน้านั้นมีสิทธิ์ในการดูหน้านั้นหรือไม่

เนื้อหาสแตติกตามนิยามจะเหมือนกันสำหรับผู้ใช้ทั้งหมด ดังนั้นจึงไม่มีการสืบค้นฐานข้อมูลที่จำเป็นในการปรับแต่งหน้าเพจนั้นสำหรับผู้ใช้แต่ละคนดังนั้นจึงเหมาะสมที่จะแคชเพื่อกำจัดการสืบค้นฐานข้อมูลที่ไม่จำเป็น รูปภาพเป็นตัวอย่างที่ดีเยี่ยมของเนื้อหาแบบสแตติก - คุณต้องการให้ผู้ใช้ทุกคนเห็นภาพส่วนหัวเดียวกัน, ปุ่มล็อกอินเดียวกัน, ฯลฯ ดังนั้นจึงเป็นตัวเลือกที่ยอดเยี่ยมสำหรับการแคช

ในตัวอย่างโค้ดของคุณด้านบนคุณจะเห็นตัวอย่าง Varnish VCL ทั่วไปที่บังคับให้ใช้รูปภาพ css และ javascript โดยค่าเริ่มต้นวานิชจะไม่ทำการร้องขอใด ๆ ที่มีคุกกี้อยู่ เหตุผลที่ว่าถ้ามีคุกกี้ในคำขอนั้นจะต้องมีเหตุผลบางอย่างที่เซิร์ฟเวอร์ต้องการคุกกี้นั้นดังนั้นจึงจำเป็นต้องมีในส่วนหลังและต้องผ่านแคช ในความเป็นจริง CMSes จำนวนมาก (Drupal, Wordpress ฯลฯ ) แนบคุกกี้กับเกือบทุกอย่างไม่ว่าจะเป็นสิ่งจำเป็นหรือไม่ดังนั้นจึงเป็นเรื่องธรรมดาที่จะเขียน VCL เพื่อตัดคุกกี้ออกจากเนื้อหาที่ทราบว่าเป็นแบบคงที่ซึ่งทำให้วานิชแคช มัน.

ทำให้รู้สึก?


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

2

สำหรับเนื้อหาแบบไดนามิกบางประเภทเช่นราคาหุ้นมักจะมีการเปลี่ยนแปลงบ่อยครั้ง (อัพเดททุกวินาทีSaaS serverจากจาก a backend server) แต่อาจถูกถามบ่อยยิ่งขึ้น (โดยหลักหมื่นsubscription clients):

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

ในกรณีนี้แคชในSaaS serverการปรับปรุงต่อวินาทีจากการทำให้มันเป็นไปเพื่อตอบสนองคำสั่งนับหมื่นของbackend serverssubscription users

หากไม่มีแคชบนเซิร์ฟเวอร์ SaaS โมเดลนี้ก็จะไม่ทำงาน


1

การแคชไฟล์แบบคงที่กับวานิชจะได้ประโยชน์ในแง่ของการถ่าย Nginx แน่นอนถ้าคุณมีไฟล์สแตติกจำนวนมากที่จะแคชมันจะเสียแรม อย่างไรก็ตามวานิชมีคุณสมบัติที่ดี - มันรองรับแบ็กเอนด์หน่วยความจำสำหรับแคช

สำหรับไฟล์คงที่: แคชเป็น HDD สำหรับทุกอย่างอื่น: แคชไปยัง RAM

สิ่งนี้จะให้ข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับวิธีใช้สถานการณ์นี้: http://www.getpagespeed.com/server-setup/varnish-static-files-cache


แค่อยากรู้ว่าทำไมคุณถึงสามารถวางไฟล์แบบคงที่ไว้ในแคช HDD - นั่นไม่ได้เป็นสิ่งเดียวกันกับการให้บริการพวกเขาจากดิสก์ที่ไม่มีแคช?
เชน N

เป็นหลักใช่ :) แต่ถ้ามีสารเคลือบเงาอยู่ในสถานที่นั้นจะต้องติดต่อแบ็กเอนด์ (Nginx, Apache, อะไรก็ตาม) เพื่อที่จะดึงข้อมูลเหล่านั้น ไม่สามารถทำได้โดยตรงจากระบบไฟล์ เพื่อกำจัดโอเวอร์เฮดของการสื่อสารแบ็คเอนด์พวกเขาควรจะถูกแคชแม้ว่าจะไปที่ดิสก์ด้วยก็ตาม
Danila Vershinin

อ่าเข้าใจแล้ว - ขอบคุณ @ danila-v
เชน N
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.