ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

เร่ง WordPress ด้วย Redis Object Cache
Home เร่ง WordPress ด้วย Redis Object Cache

เร่ง WordPress ด้วย Redis Object Cache

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

Object Cache เก็บผลเหล่านั้นไว้ข้ามคำขอ ทำให้จำนวน Query ต่อหน้าลดลงได้มาก โดยเฉพาะบนเว็บที่มีปลั๊กอินเยอะหรือใช้ WooCommerce ซึ่งเห็นผลชัดเจนที่สุด

สิ่งที่ต้องเตรียม

  • สิทธิ์ SSH บนเซิร์ฟเวอร์ หรือโฮสติ้งที่มี Redis ให้แล้ว
  • สิทธิ์แก้ไฟล์ wp-config.php
  • หน่วยความจำว่างอย่างน้อย 256 MB สำหรับ Redis

ขั้นตอนที่ 1: วัดสถานะก่อน

ติดตั้ง Query Monitor แล้วเปิดหน้าแรก จดตัวเลขสองอย่างไว้เปรียบเทียบ จำนวน Query ทั้งหมด และเวลาที่ใช้กับฐานข้อมูล

wp eval 'global $wpdb; echo $wpdb->num_queries;'

ขั้นตอนที่ 2: ติดตั้ง Redis

sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli ping

ตั้งค่าให้เหมาะกับการเป็นแคช

sudo nano /etc/redis/redis.conf
bind 127.0.0.1 ::1
port 6379
maxmemory 512mb
maxmemory-policy allkeys-lru

# แคชไม่จำเป็นต้องคงทน ปิดเพื่อลดภาระดิสก์
save ""
appendonly no
sudo systemctl restart redis-server
redis-cli CONFIG GET maxmemory-policy

นโยบาย allkeys-lru สำคัญ มันทำให้ Redis ลบข้อมูลที่ไม่ได้ใช้นานที่สุดเมื่อหน่วยความจำเต็ม แทนที่จะปฏิเสธการเขียนซึ่งจะทำให้เว็บพัง

ขั้นตอนที่ 3: ติดตั้งส่วนขยายของ PHP

sudo apt install -y php8.3-redis
sudo systemctl restart php8.3-fpm
php -m | grep redis

ต้องเป็นเวอร์ชันที่ตรงกับ PHP ที่เว็บใช้จริง ตรวจด้วย php -v หากมีหลายเวอร์ชันบนเครื่องเดียวกัน

ขั้นตอนที่ 4: ตั้งค่าใน wp-config.php

nano /var/www/example.com/wp-config.php

เพิ่มก่อนบรรทัด /* That's all, stop editing! */

define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_TIMEOUT', 1);
define('WP_REDIS_READ_TIMEOUT', 1);
define('WP_REDIS_DATABASE', 0);

// สำคัญมากเมื่อมีหลายเว็บใช้ Redis เครื่องเดียวกัน
define('WP_CACHE_KEY_SALT', 'example.com:');

// เปิด Object Cache
define('WP_CACHE', true);

WP_CACHE_KEY_SALT คือสิ่งที่ห้ามลืม หากมีสองเว็บใช้ Redis เดียวกันโดยไม่ตั้งค่านี้ ข้อมูลจะปนกัน และผู้ใช้เว็บหนึ่งอาจเห็นเนื้อหาของอีกเว็บ

ทางเลือกที่ปลอดภัยกว่าคือแยกฐานข้อมูลของ Redis ให้แต่ละเว็บ

// เว็บที่ 1
define('WP_REDIS_DATABASE', 0);
// เว็บที่ 2
define('WP_REDIS_DATABASE', 1);

ขั้นตอนที่ 5: ติดตั้งปลั๊กอินและเปิดใช้งาน

wp plugin install redis-cache --activate
wp redis enable
wp redis status

ผลลัพธ์ควรแสดง Status: Connected หากเป็น Not connected ให้ดูขั้นตอนแก้ปัญหาท้ายคู่มือ

ตรวจว่ามีไฟล์ object-cache.php ถูกสร้างขึ้นใน wp-content/ ซึ่งเป็นตัวที่ทำให้ WordPress ใช้ Redis จริง

ls -l /var/www/example.com/wp-content/object-cache.php

ขั้นตอนที่ 6: วัดผล

# ดูสถิติของ Redis
redis-cli INFO stats | grep -E 'keyspace_hits|keyspace_misses'
redis-cli INFO memory | grep used_memory_human
redis-cli DBSIZE

คำนวณอัตราการใช้แคชสำเร็จ = hits หารด้วย (hits + misses) ค่าที่ดีคือสูงกว่า 90%

เปรียบเทียบจำนวน Query ในหน้าเดิมกับที่จดไว้ในขั้นตอนที่ 1 เว็บทั่วไปมักลดลง 30-50% และเว็บที่มีปลั๊กอินเยอะลดได้มากกว่านั้น

# ดูคีย์ที่ถูกสร้าง
redis-cli --scan --pattern 'example.com:*' | head -20

ขั้นตอนที่ 7: ล้างแคชเมื่อจำเป็น

# ล้างของเว็บนี้ผ่านปลั๊กอิน
wp cache flush

# ล้างทั้งหมดใน Redis ระวังกระทบเว็บอื่นที่ใช้ร่วมกัน
redis-cli FLUSHALL

# ล้างเฉพาะฐานข้อมูลที่เว็บนี้ใช้
redis-cli -n 0 FLUSHDB

ตั้งให้ล้างอัตโนมัติเมื่อปรับใช้โค้ดใหม่ โดยเพิ่ม wp cache flush เข้าไปในสคริปต์ปรับใช้

ขั้นตอนที่ 8: เฝ้าดูและปรับ

redis-cli INFO memory | grep -E 'used_memory_human|maxmemory_human|evicted_keys'

ค่า evicted_keys ที่สูงและเพิ่มขึ้นเรื่อย ๆ แปลว่าหน่วยความจำไม่พอ แคชจึงถูกลบก่อนที่จะได้ใช้ เพิ่ม maxmemory หรือลดจำนวนเว็บที่ใช้ร่วมกัน

redis-cli --stat

ปัญหาที่พบบ่อย

wp redis status ขึ้น Not connected

ไล่ตรวจตามลำดับ Redis ทำงานอยู่ด้วย redis-cli ping ส่วนขยาย PHP ติดตั้งแล้วด้วย php -m | grep redis และรีสตาร์ต PHP-FPM แล้วหรือยัง ขั้นตอนสุดท้ายนี้คือที่ลืมกันบ่อยที่สุด

เว็บขาวหลังเปิดใช้งาน

ลบไฟล์ object-cache.php ทิ้ง เว็บจะกลับมาทำงานทันที แล้วค่อยไล่หาสาเหตุ

rm /var/www/example.com/wp-content/object-cache.php

เห็นข้อมูลของเว็บอื่น

ไม่ได้ตั้ง WP_CACHE_KEY_SALT หรือใช้ฐานข้อมูล Redis เดียวกัน แก้ตามขั้นตอนที่ 4 แล้วล้างแคชทั้งหมด

แก้เนื้อหาแล้วหน้าเว็บยังเป็นของเดิม

Object Cache ต่างจาก Page Cache หากยังเห็นของเก่าให้ล้างทั้งสองชั้น ทั้ง wp cache flush และแคชของหน้าเว็บที่ปลั๊กอินหรือ Nginx ทำไว้

Redis กินหน่วยความจำจนเครื่องเต็ม

ตั้ง maxmemory ให้ชัดเจนตามขั้นตอนที่ 2 อย่าปล่อยว่างไว้ เพราะค่าเริ่มต้นคือไม่จำกัด

ต้องการโฮสติ้งที่มี Redis พร้อมใช้งานและปรับจูนมาให้แล้ว ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security