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

พูดตามตรง Memcached ติดตั้งง่ายมากสำหรับเว็บไซต์เดียว แต่จะเริ่มซับซ้อนขึ้นเมื่อต้องใช้งานหลายเว็บไซต์พร้อมกัน ทำไมล่ะ?
โดยค่าเริ่มต้น Memcached จะรวมแคชชั่วคราวและแคชอ็อบเจ็กต์ของเว็บไซต์ทั้งหมดไว้ในพูลเดียวกัน ลองนึกภาพว่าถ้าเว็บไซต์ A และ B บังเอิญใช้คีย์แคชเดียวกัน นั่นจะทำให้เกิดความวุ่นวาย ข้อมูลของ A จะเขียนทับข้อมูลของ B โดยตรง และเว็บไซต์ทั้งสองจะเริ่ม "รบกวน" ข้อมูลของกันและกัน
สิ่งที่ฉันเจอช่างน่าขันยิ่งกว่านั้น: หน้าแสดงรายละเอียดสินค้าบน เว็บไซต์ อีคอมเมิร์ซแห่งหนึ่ง แสดงเนื้อหาบทความจากเว็บไซต์บล็อกอื่น ฉันตกตะลึงและคิดในใจว่า "นี่มันอะไรกันเนี่ย?!"
ฉันใช้เวลาทั้งคืนกว่าจะหาทางแก้ไขได้ ปรากฏว่าเป็นปัญหาความขัดแย้งของคีย์แคช
วันนี้ผมเลยอยากจะมาแชร์วิธีการตั้งค่าของผม เผื่อจะเป็นประโยชน์กับเพื่อนๆ ที่มีความต้องการแบบเดียวกัน ผมเองก็ยังอยู่ในช่วงทดลองอยู่ และบางไอเดียอาจยังไม่สมบูรณ์ แต่สำหรับผมแล้ว วิธีนี้ก็ใช้ได้ผลดีครับ
การเตรียมสภาพแวดล้อมเซิร์ฟเวอร์
ก่อนเริ่มการตั้งค่า WordPress คุณต้องตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์มีบริการ Memcached และส่วนขยาย PHP Memcached ติดตั้งอยู่แล้ว
ฉันจะติดตั้ง Memcached โดยใช้ HestiaCP ได้อย่างไร?
ยกตัวอย่างเช่น Ubuntu นั้น ใช้คำสั่งเพียงแค่สามบรรทัดเท่านั้น
sudo apt update
sudo apt install memcached php-memcached
sudo systemctl restart php8.x-fpm # 根据你的 PHP 版本改หลังจากติดตั้งเสร็จแล้ว อย่าลืมตรวจสอบว่าบริการ Memcached ทำงานอยู่หรือไม่
sudo systemctl status memcachedถ้าคุณเห็นคำว่า "กำลังทำงาน" แสดงว่าไม่มีปัญหาอะไร
โปรดทราบว่าชื่อแพ็กเกจอาจแตกต่างกันไปในแต่ละระบบ สำหรับระบบที่ใช้ Debian จะใช้คำสั่งนี้โดยทั่วไป แต่สำหรับCentOSหรือระบบปฏิบัติการอื่นๆ คุณอาจต้องใช้ yum หรือ dnf ในการติดตั้ง
ตอนนั้นผมใช้ Ubuntu 20.04 และกระบวนการทั้งหมดก็ดำเนินไปอย่างราบรื่นพอสมควร
การดำเนินการหลัก: กำหนดค่าคำนำหน้าแคช
ขั้นตอนนี้เป็นหัวใจสำคัญของการตั้งค่าทั้งหมด และเป็นกุญแจสำคัญในการป้องกันความสับสนของข้อมูล
คุณต้องเพิ่มคำนำหน้าแคชที่ไม่ซ้ำกันลงในไฟล์ wp-config.php ในไดเร็กทอรีรากของเว็บไซต์ WordPress แต่ละเว็บไซต์
เปิดไฟล์ wp-config.php ของเว็บไซต์แรก แล้วค้นหาบรรทัดความคิดเห็นนี้
/* That's all, stop editing! Happy blogging. */เพิ่มเหนือบรรทัดนี้
// 网站 A 的配置
define( 'WP_CACHE_KEY_SALT', 'site1_unique_string_' );จากนั้นเปิดไฟล์ wp-config.php บนเว็บไซต์ที่สองและเพิ่มการตั้งค่าที่คล้ายกันเข้าไป
// 网站 B 的配置
define( 'WP_CACHE_KEY_SALT', 'site2_unique_string_' );ผมบอกคุณเลยว่า สตริงที่อยู่หลัง WP_CACHE_KEY_SALT จะต้องไม่ซ้ำกันอย่างแน่นอนผมแนะนำให้คุณใช้ชื่อโดเมนเว็บไซต์ของคุณหรือตัวย่อ เช่น site1_com_ หรือ site2_net_
ฉันขี้เกียจเลยใช้หมายเลขแทน แต่สามเดือนต่อมาฉันลืมไปหมดแล้วว่าหมายเลขไหนตรงกับเว็บไซต์ไหน และต้องไปค้นหาทีละอัน ซึ่งมันปวดหัวมาก
ลองคิดดูสิ: Memcached ทำงานโดยการจัดเก็บและเรียกใช้ข้อมูลโดยอิงจากคีย์แคช หากคุณกำหนดคำนำหน้าที่ไม่ซ้ำกันสำหรับแต่ละเว็บไซต์ ข้อมูลของเว็บไซต์เหล่านั้นก็จะถูกแยกออกจากกันโดยธรรมชาติและจะไม่รบกวนซึ่งกันและกัน
เปรียบเสมือนการจัดสรรตู้เก็บของส่วนตัวให้กับแต่ละเว็บไซต์ แม้ว่าทั้งหมดจะอยู่ในห้องเดียวกัน แต่กุญแจต่างกัน ข้อมูลจึงจะไม่ปะปนกัน
เปิดใช้งานการแคชวัตถุ
หลังจากตั้งค่าคำนำหน้าเสร็จแล้ว ขั้นตอนต่อไปคือการเปิดใช้งาน WordPress เพื่อให้สามารถใช้งาน Memcached ได้จริง
มีสองตัวเลือกให้เลือก และฉันได้ลองใช้ทั้งสองแบบแล้ว แต่ละแบบมีข้อดีของตัวเอง
ตัวเลือกที่ 1: วิธีการเสียบปลั๊ก (สะดวกที่สุด)
ล็อกอินเข้าสู่แผงควบคุมผู้ดูแลระบบ WordPress และติดตั้งปลั๊กอินแคชที่รองรับ Memcached
ฉันแนะนำให้ใช้W3 Total Cacheครับ มันค่อนข้างเสถียร หลังจากติดตั้งแล้ว ในการตั้งค่าปลั๊กอิน ให้เลือก Memcached เป็นประเภทแคช ป้อน 127.0.0.1 สำหรับเซิร์ฟเวอร์ และพอร์ตเริ่มต้น 11211 จากนั้นบันทึก
หากคุณต้องการโซลูชันที่บริสุทธิ์กว่า คุณสามารถติดตั้ง ปลั๊กอิน Memcached Object Cache ได้โดยตรง ซึ่งออกแบบมาเพื่อการทำงานนี้โดยเฉพาะและไม่มีฟังก์ชันอื่น ๆ ที่ไม่จำเป็น
พูดตามตรง ตอนแรกฉันคิดว่าวิธีการใช้ปลั๊กอินนั้นค่อนข้างดี เพราะมันสะดวก แต่ต่อมาฉันพบว่าปลั๊กอินบางตัวมาพร้อมกับฟีเจอร์มากมายที่ฉันไม่ต้องการ และฉันก็กังวลเรื่องการอัปเดตอยู่เสมอ กลัวว่าพวกเขาจะเพิ่มฟีเจอร์อะไรบางอย่างที่ทำให้การตั้งค่าของฉันยุ่งเหยิง
ตัวเลือกที่ 2: ติดตั้ง object-cache.php ด้วยตนเอง (ควบคุมได้มากกว่า)
ถ้าคุณเป็นคนค่อนข้างพิถีพิถันเหมือนฉันและไม่อยากติดตั้งปลั๊กอินมากเกินไป คุณสามารถใช้วิธีนี้ได้
ดาวน์โหลด ปลั๊กอิน Memcached Object Cacheจากคลังปลั๊กอินอย่างเป็นทางการของ WordPress หรือค้นหาไฟล์ object-cache.php เวอร์ชันล่าสุดบน GitHub จากนั้น อัปโหลดไฟล์ object-cache.php ที่แตกไฟล์แล้วไปยังไดเร็กทอรี wp-content ของแต่ละเว็บไซต์ผ่าน FTP หรือ SSH
โปรดทราบว่านี่คือไดเร็กทอรีหลักของ wp-content ไม่ใช่ไดเร็กทอรีย่อย plugins
หลังจากเพิ่มแล้ว WordPress จะตรวจจับและเปิดใช้งานแคชโดยอัตโนมัติ คุณไม่จำเป็นต้องตั้งค่าอะไรเพิ่มเติม เพราะมันจะอ่านค่า WP_CACHE_KEY_SALT ที่คุณตั้งไว้ก่อนหน้านี้ในไฟล์ wp-config.php
ฉันต้องการประหยัดเวลา ดังนั้นฉันจึงเลือกใช้วิธีนี้เป็นหลัก เพราะมันควบคุมได้ หากเกิดปัญหาขึ้น ฉันรู้ว่าจะไปหาทางแก้ไขได้ที่ไหน และฉันจะไม่ถูกจับได้โดยไม่ทันตั้งตัวจากการอัปเดตปลั๊กอินอัตโนมัติ
ตรวจสอบว่าการตั้งค่ามีผลใช้งานได้จริง
หลังจากเตรียมตัวอย่างเสร็จแล้ว คุณย่อมอยากรู้ว่ามันประสบความสำเร็จหรือไม่ใช่ไหม?
วิธีที่ง่ายที่สุดคือตรวจสอบสถานะของ Memcached โดยเชื่อมต่อผ่าน telnet หรือเครื่องมือ nc
echo "stats" | nc 127.0.0.1 11211จากนั้นคุณจะเห็นสถิติต่างๆ มากมาย โปรดให้ความสนใจเป็นพิเศษกับค่าของ `cmd_set` และ `get_hits` และรีเฟรชหน้าเว็บหลายๆ ครั้งเพื่อดูว่าค่าเหล่านี้เพิ่มขึ้นหรือไม่ หากเพิ่มขึ้น แสดงว่าแคชทำงานได้อย่างถูกต้อง
อีกวิธีที่เข้าใจง่ายกว่าในการตรวจสอบเรื่องนี้คือการเปิดเว็บไซต์ทั้งสองพร้อมกันและดูว่ามันรบกวนกันหรือไม่ หากเว็บไซต์ A ไม่แสดงเนื้อหาจากเว็บไซต์ B แสดงว่าคำนำหน้า (prefix) นั้นใช้งานได้แล้ว
ในตอนนั้น ผมได้ทำการทดสอบที่เข้มงวดกว่าเดิม ผมตั้งค่าค่าชั่วคราวที่แตกต่างกันในเว็บไซต์สองแห่ง แล้วใช้เครื่องมือ nc เพื่อสอบถามข้อมูลใน Memcached โดยตรง ผลที่ได้คือ ผมสามารถเห็นคู่คีย์-ค่าสองคู่ที่มีคำนำหน้าต่างกันได้อย่างชัดเจน โดยไม่มีความสับสนใดๆ เลย
ณ ขณะนั้น ผมรู้สึกว่าตัวเองได้ทำสิ่งที่ยิ่งใหญ่สำเร็จ และแค่คิดถึงเรื่องนั้นก็ทำให้ผมรู้สึกเยี่ยมยอดแล้ว
อย่าละเลยเรื่องความปลอดภัย
เนื่องจากเว็บไซต์ทั้งหมดใช้ Memcached อินสแตนซ์เดียวกัน จึงมีความเสี่ยงด้านความปลอดภัยที่คุณควรทราบ
ในทางทฤษฎี หากมีผู้ใช้รายอื่นอยู่ในเซิร์ฟเวอร์ พวกเขาสามารถอ่านข้อมูลที่แคชไว้ของคุณผ่านพอร์ตภายในเครื่องได้ แม้ว่าการทำเช่นนี้จะต้องการความเชี่ยวชาญทางเทคนิคในระดับหนึ่ง แต่การระมัดระวังไว้ก่อนย่อมเป็นเรื่องที่ฉลาดเสมอ
ดังนั้น คุณต้องตรวจสอบให้แน่ใจว่าบริการ Memcached ของคุณจะไม่รับฟังที่อยู่ IP สาธารณะโดยเด็ดขาดตรวจสอบให้แน่ใจว่ามีบรรทัดนี้อยู่ในไฟล์การกำหนดค่า `/etc/memcached.conf`
-l 127.0.0.1ด้วยวิธีนี้ Memcached จะรับฟังเฉพาะที่อยู่ loopback ภายในเครื่องเท่านั้น และจะไม่สามารถเข้าถึงได้จากภายนอก
หากคุณมีข้อกำหนดด้านความปลอดภัยที่สูงมาก หรือหากเซิร์ฟเวอร์ของคุณโฮสต์เว็บไซต์ที่ผู้ใช้รายอื่นไม่สบายใจ ผมขอแนะนำให้คุณพิจารณาใช้Redisแทน Memcached Redis รองรับการแยกฐานข้อมูลหลายฐานและการตรวจสอบรหัสผ่าน ทำให้มีความปลอดภัยมากกว่ามาก
อย่างไรก็ตาม การตั้งค่า Redis นั้นซับซ้อนกว่า Memcached เล็กน้อย หากคุณใช้เพื่อส่วนตัวหรือทีมขนาดเล็ก Memcached ที่มีขีดจำกัดการรับฟัง 127.0.0.1 ก็เพียงพอแล้ว
อุปสรรคบางประการที่พบเจอ
สุดท้ายนี้ ผมขอแบ่งปันข้อผิดพลาดบางประการที่ผมเคยเจอ หวังว่าจะช่วยให้คุณหลีกเลี่ยงเส้นทางที่ผิดพลาดเหล่านั้นได้
ตรวจสอบให้แน่ใจว่าเวอร์ชันส่วนขยาย PHP ของคุณเข้ากันได้ก่อนหน้านี้ฉันเคยเจอปัญหาที่ติดตั้งส่วนขยาย php-memcached แล้ว แต่ WordPress ไม่รู้จัก ต่อมาฉันพบว่าสาเหตุเกิดจากเวอร์ชัน PHP ไม่ตรงกัน ดังนั้น โปรดตรวจสอบเวอร์ชัน PHP อย่างละเอียดเมื่อติดตั้งส่วนขยายเพื่อหลีกเลี่ยงการติดตั้งเวอร์ชันที่ไม่ถูกต้อง
ตรวจสอบให้แน่ใจว่าคุณระบุพาธไปยังไฟล์ object-cache.php ถูกต้อง ไฟล์นี้ต้องอยู่ในไดเร็กทอรีหลักของ wp-content ไม่ใช่ไดเร็กทอรี plugins เพื่อนของฉันคนหนึ่งวางไว้ผิดที่และเสียเวลาไปกับการพยายามแก้ไขอยู่นานโดยไม่สำเร็จ
อย่าใช้สตริงสั้นๆ สำหรับคำนำหน้าแคชของคุณตอนแรกผมใช้สตริงอย่าง a_ และ b_ แต่พบว่ามันสั้นเกินไปและไปซ้ำกับคีย์แคชที่ WordPress สร้างขึ้นได้ง่าย ควรใช้สตริงแบบสุ่มที่มีความยาวอย่างน้อยเจ็ดหรือแปดตัวอักษร หรือตัวย่อของโดเมน
เมื่อล้างแคช โปรดจำไว้ว่าต้องล้างแคชของทั้งสองเว็บไซต์ครั้งหนึ่งฉันล้างแคชแค่เว็บไซต์เดียว แต่เว็บไซต์อีกแห่งยังคงเก็บข้อมูลเก่าไว้ ทำให้เกิดความไม่สอดคล้องกันระหว่างสองเว็บไซต์ ฉันใช้เวลานานมากในการหาสาเหตุของปัญหา
พูดตามตรง ผมไม่แน่ใจว่าประสบการณ์เหล่านี้จะเป็นประโยชน์กับทุกคนหรือไม่ แต่ผมก็แบ่งปันประสบการณ์เหล่านี้โดยไม่ปิดบัง
เขียนตอนท้าย
การตั้งค่า Memcached สำหรับหลายเว็บไซต์นั้นไม่ซับซ้อนในทางเทคนิค ปัญหาหลักอยู่ที่การตั้งค่าคำนำหน้าแคช อย่างไรก็ตาม รายละเอียดปลีกย่อยต่างหากที่เป็นปัญหาใหญ่ ปัญหาเกี่ยวกับการจับคู่เวอร์ชัน เส้นทางไฟล์ และการตั้งค่าความปลอดภัย อาจทำให้คุณประสบปัญหาอย่างมาก
ฉันใช้วิธีนี้มาเกือบปีแล้ว โดยดูแลเว็บไซต์ WordPress สามเว็บไซต์ และจนถึงตอนนี้ก็ยังไม่พบปัญหาใหญ่ใดๆ หากคุณกำลังทำอะไรที่คล้ายๆ กัน คุณอาจลองใช้วิธีนี้ดูก็ได้
อย่างไรก็ตาม หากคุณมีวิธีแก้ปัญหาที่ดีกว่า หรือเคยพบเจอปัญหาหรืออุปสรรคที่น่าสนใจใดๆ โปรดแสดงความคิดเห็นและแบ่งปันได้เลย ผมยินดีที่จะเรียนรู้จากคุณ
ท้ายที่สุดแล้ว ยิ่งมีคนรู้เรื่องนี้มากเท่าไหร่ โอกาสที่จะตกเป็นเหยื่อก็จะยิ่งน้อยลงเท่านั้น ใช่ไหม?
เนื่องจากคุณอ่านมาถึงตรงนี้แล้ว ถ้าคุณคิดว่ามีประโยชน์ โปรดกดไลค์และแชร์ด้วยนะคะ และถ้าอยากรับข่าวสารอัปเดตก่อนใคร สามารถติดตามฉันได้เลยค่ะ!
ขอบคุณที่อ่านบทความของฉัน แล้วพบกันใหม่ครั้งหน้า
หวังว่า บทความ "วิธีแชร์ Memcached กับเว็บไซต์ WordPress หลายเว็บไซต์บนเซิร์ฟเวอร์เดียวกัน? คู่มือการตั้งค่าขั้นสุดยอดเพื่อป้องกันข้อผิดพลาด 100%" ที่เผยแพร่ในบล็อกของ Chen Weiliang ( https://www.chenweiliang.com/ ) จะเป็นประโยชน์กับคุณ
โปรดแชร์ลิงก์บทความนี้ได้ตามสบาย: https://www.chenweiliang.com/cwl-34368.html
