ติดตั้ง Redis Cache บน VPS Ubuntu

Redis คือ In-Memory Data Store ที่เก็บข้อมูลไว้ใน RAM ทำให้ดึงข้อมูลได้เร็วกว่า MySQL หรือ File System หลายร้อยเท่า เหมาะสำหรับ Session Cache, Object Cache, Queue และ Rate Limiting บทความนี้จะพาติดตั้ง Redis บน VPS Ubuntu และตั้งค่าให้ใช้งานจริงกับ PHP และ WordPress

ความต้องการระบบ

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

อัพเดท package list แล้วติดตั้ง Redis:

apt update && apt install redis-server -y

ตรวจสอบว่า Redis รันอยู่:

systemctl status redis-server

ทดสอบเบื้องต้น:

redis-cli ping

ถ้าได้ PONG กลับมา แสดงว่า Redis ทำงานปกติ

ขั้นตอนที่ 2: ตั้งค่า Redis

แก้ไขไฟล์ config หลัก:

nano /etc/redis/redis.conf

จำกัด Memory ที่ใช้

หา # maxmemory แล้วแก้เป็น (ใช้ประมาณ 25% ของ RAM ทั้งหมด):

maxmemory 256mb maxmemory-policy allkeys-lru

ตั้งให้รับเฉพาะ Localhost

ค้นหา bind แล้วตรวจให้แน่ใจว่าเป็น:

bind 127.0.0.1 -::1

เปิดใช้ Persistent Storage (แนะนำ)

ให้ Redis บันทึกข้อมูลลงดิสก์เพื่อกู้คืนหลัง Reboot:

save 900 1 save 300 10 save 60 10000

Reload config:

systemctl restart redis-server systemctl enable redis-server

maxmemory-policy allkeys-lru หมายความว่า เมื่อ Redis เต็ม จะลบ key ที่ใช้นานที่สุดออกอัตโนมัติ เหมาะสำหรับ Cache ทั่วไป

ขั้นตอนที่ 3: ใช้ Redis กับ PHP

ติดตั้ง PHP Extension สำหรับ Redis:

apt install php-redis -y systemctl restart php8.2-fpm # หรือ version ที่ใช้อยู่

ทดสอบใน PHP:

<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // เก็บค่า $redis->set('test_key', 'Hello Redis!', 60); // หมดอายุใน 60 วินาที // ดึงค่า echo $redis->get('test_key'); // Hello Redis! ?>

ขั้นตอนที่ 4: ใช้ Redis กับ WordPress

Redis ช่วยเพิ่มความเร็ว WordPress ได้มากโดยเก็บ DB Query Cache ไว้ใน Memory

ติดตั้ง Plugin

ติดตั้ง Plugin Redis Object Cache จาก WordPress Repository แล้วไปที่ Settings → Redis Object Cache → Enable Object Cache

หรือตั้งค่าใน wp-config.php

define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379); define('WP_CACHE', true);

ผลลัพธ์ที่เห็นได้ชัด: WordPress ที่มี Redis Object Cache มักลด Response Time ลงได้ 30–60% เพราะไม่ต้อง Query Database ซ้ำทุก Request

ขั้นตอนที่ 5: Monitor และ Flush Cache

ดู Stats Redis แบบ Realtime

redis-cli monitor # ดู command ทั้งหมด realtime redis-cli info stats # ดู hit/miss ratio redis-cli info memory # ดูการใช้ RAM

ดู Hit Rate

redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"

Hit Rate ควรอยู่เกิน 80% ถ้าต่ำกว่านั้นอาจต้องปรับ maxmemory ให้เพิ่มขึ้น

ล้าง Cache ทั้งหมด

redis-cli flushall

ติดตั้ง Redis บน VPS แบบครบขั้นตอน (Production)

ในสภาพแวดล้อมจริงบน VPS เราควรติดตั้งให้รัดกุมกว่าการ apt install เพียงอย่างเดียว — ตั้งแต่ตรวจ version, สร้าง user สำหรับรัน service, จนถึงเปิด systemd unit ให้รันอัตโนมัติหลัง reboot ขั้นตอนด้านล่างทดสอบกับ Ubuntu 22.04 LTS บน AsiaGB VPS (เริ่มต้น 500 บาท/เดือน) ซึ่งให้สิทธิ์ Full Root Access จึงรันได้ทุกคำสั่ง

ขั้นแรกอัพเดทระบบและติดตั้ง Redis พร้อมเครื่องมือที่จำเป็น:

apt update && apt upgrade -y
apt install redis-server redis-tools -y
redis-server --version
redis-cli --version

ตรวจว่า Redis ทำงานและตั้งให้เปิดอัตโนมัติเมื่อ VPS reboot:

systemctl enable --now redis-server
systemctl status redis-server --no-pager
redis-cli ping        # ต้องได้ PONG

โดยปกติ Redis บน Ubuntu จะรันด้วย user redis ผ่าน systemd อยู่แล้ว ตรวจได้ด้วย:

ps -u redis -o pid,cmd
ss -tlnp | grep 6379    # ต้องผูกกับ 127.0.0.1:6379 เท่านั้น

ถ้า ss แสดงว่า Redis ฟังอยู่ที่ 0.0.0.0:6379 (ทุก interface) แสดงว่าเปิดสู่อินเทอร์เน็ตสาธารณะ ต้องรีบแก้ทันทีในหัวข้อความปลอดภัยด้านล่าง เพราะ Redis ที่เปิด public โดยไม่มีรหัสผ่านคือช่องโหว่ที่ถูกสแกนและโจมตีบ่อยที่สุดบน VPS

ใช้ Redis เป็น Cache สำหรับ WordPress และ Laravel

ประโยชน์ที่ชัดเจนที่สุดของ Redis บน VPS คือใช้เป็น Object Cache และ Session Store ให้ทั้ง WordPress และ Laravel โดยย้ายภาระจาก MySQL และ filesystem มาเก็บไว้ใน RAM ทำให้แต่ละ request ตอบเร็วขึ้นมาก โดยเฉพาะเว็บที่มีปลั๊กอินเยอะหรือ query ซับซ้อน

WordPress — Object Cache

หลังติดตั้งปลั๊กอิน Redis Object Cache แล้ว ให้เพิ่มค่าใน wp-config.php เพื่อแยก cache ของแต่ละเว็บไม่ให้ชนกัน (สำคัญมากถ้าใช้ Redis ตัวเดียวกับหลายเว็บ):

define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_CACHE_KEY_SALT', 'mysite_');  // prefix กัน key ชนกันระหว่างเว็บ
define('WP_REDIS_MAXTTL', 86400);
define('WP_CACHE', true);

จากนั้นเข้า Settings → Redis แล้วกด Enable Object Cache เมื่อต่อสำเร็จจะเห็นสถานะ Connected และ Hit Rate เพิ่มขึ้นเรื่อย ๆ ตามการใช้งาน

Laravel — Cache และ Session

Laravel รองรับ Redis ในตัวผ่านแพ็กเกจ predis/predis หรือ PhpRedis extension ตั้งค่าใน .env:

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=ใส่รหัสผ่านที่ตั้งไว้
REDIS_PORT=6379

ตัวอย่างการใช้ Cache ใน Laravel ที่เก็บผลลัพธ์ query หนัก ๆ ไว้ 10 นาที:

use Illuminate\Support\Facades\Cache;

$users = Cache::remember('active_users', 600, function () {
    return User::where('active', 1)->get();
});

การย้าย Session ไปไว้บน Redis ยังช่วยให้ scale ได้ง่ายขึ้น เพราะ session ไม่ผูกกับไฟล์บนเครื่องใดเครื่องหนึ่ง เหมาะกับเว็บที่มีผู้ใช้พร้อมกันจำนวนมาก

เคล็ดลับ: ใช้ WP_REDIS_DATABASE หรือ REDIS_DB ต่างเลขกัน (0–15) เพื่อแยก cache ของแต่ละแอป/เว็บบน Redis instance เดียว จะ flush เฉพาะเว็บใดเว็บหนึ่งได้โดยไม่กระทบตัวอื่น

ตั้งค่าความปลอดภัยของ Redis (bind, requirepass, protected-mode)

Redis ถูกออกแบบให้รันในเครือข่ายภายในที่เชื่อถือได้ ค่าเริ่มต้นจึงไม่เน้นความปลอดภัยมากนัก บน VPS ที่มี Public IP เราต้องปิดช่องทางเข้าถึงจากภายนอกให้หมด มิฉะนั้นบอตจะสแกนพอร์ต 6379 แล้วยึดเครื่องไปขุดเหรียญหรือทำ botnet ได้ภายในไม่กี่นาที

1. ผูกเฉพาะ localhost และเปิด protected-mode

แก้ไฟล์ /etc/redis/redis.conf ให้แน่ใจว่ามีค่าต่อไปนี้:

bind 127.0.0.1 -::1
protected-mode yes
port 6379

protected-mode yes จะปฏิเสธการเชื่อมต่อจากภายนอกที่ไม่มีรหัสผ่านโดยอัตโนมัติ ถือเป็นด่านป้องกันชั้นแรก

2. ตั้งรหัสผ่านด้วย requirepass

สร้างรหัสผ่านที่ยาวและสุ่ม แล้วใส่ในไฟล์ config:

# สร้างรหัสผ่านสุ่ม 32 ไบต์
openssl rand -base64 32

# ในไฟล์ /etc/redis/redis.conf เพิ่ม:
requirepass your_long_random_password_here

หลังตั้งรหัสผ่าน การเชื่อมต่อต้อง authenticate ก่อนใช้งาน:

redis-cli
127.0.0.1:6379> AUTH your_long_random_password_here
OK

3. ปิดหรือเปลี่ยนชื่อคำสั่งอันตราย

คำสั่งอย่าง FLUSHALL, CONFIG, KEYS อาจถูกใช้ทำลายข้อมูลหรือ DoS ได้ ปิดหรือเปลี่ยนชื่อใน config:

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG "CONFIG_a8f3k2"

4. เสริมด้วย Firewall

ปิดพอร์ต 6379 จากภายนอกอีกชั้นด้วย UFW เพื่อความมั่นใจ:

ufw deny 6379
ufw reload

หลังแก้ค่าทั้งหมด รีสตาร์ทเพื่อให้มีผล:

systemctl restart redis-server

ข้อควรระวัง: ห้ามใส่ bind 0.0.0.0 บน VPS ที่มี Public IP โดยเด็ดขาด หากต้องให้แอปจากเครื่องอื่นต่อ Redis ให้ใช้ SSH tunnel หรือ private network ภายใน datacenter แทนการเปิดพอร์ตสู่อินเทอร์เน็ต

ตั้งค่า maxmemory, Eviction Policy และ Monitoring

RAM บน VPS มีจำกัด การคุม Redis ไม่ให้กิน RAM จนระบบล่ม (OOM kill) จึงสำคัญมาก เราใช้ maxmemory กำหนดเพดาน และ maxmemory-policy บอกว่าจะทำอย่างไรเมื่อเต็ม

เลือก Eviction Policy ให้ตรงงาน

Policy พฤติกรรมเมื่อ RAM เต็ม เหมาะกับ
allkeys-lru ลบ key ที่ใช้นานสุด Cache ทั่วไป, WordPress
allkeys-lfu ลบ key ที่ใช้บ่อยน้อยสุด Cache ที่มี hot key ชัดเจน
volatile-lru ลบเฉพาะ key ที่ตั้ง TTL ผสม cache + ข้อมูลถาวร
noeviction ปฏิเสธ write ใหม่ (error) ใช้ Redis เป็น database จริง

ตัวอย่างค่าที่แนะนำสำหรับ VPS ขนาด 2 GB RAM (จัดสรรให้ Redis ~512 MB):

maxmemory 512mb
maxmemory-policy allkeys-lru
maxmemory-samples 5

Monitoring การใช้งานจริง

ติดตามสุขภาพ Redis เป็นประจำด้วยคำสั่งเหล่านี้:

redis-cli info memory | grep used_memory_human
redis-cli info stats | grep -E "keyspace_hits|keyspace_misses|evicted_keys"
redis-cli --stat        # ตัวเลขสด ๆ ทุก 1 วินาที
redis-cli dbsize        # จำนวน key ทั้งหมด

ดู Hit Rate จากสูตร hits / (hits + misses) ควรเกิน 80% ถ้า evicted_keys สูงขึ้นเรื่อย ๆ แปลว่า RAM ไม่พอ ควรเพิ่ม maxmemory หรืออัปเกรดแพ็กเกจ VPS ให้มี RAM มากขึ้น นอกจากนี้ควรตรวจค่า mem_fragmentation_ratio ใน info memory เป็นระยะ หากค่าสูงกว่า 1.5 มากแสดงว่ามีการ fragment ของหน่วยความจำ อาจพิจารณารีสตาร์ท Redis ในช่วงที่ทราฟฟิกน้อยเพื่อคืน RAM ให้ระบบ

สำหรับเว็บที่มีทราฟฟิกสูง ควรตั้งการแจ้งเตือน (alert) เมื่อ Redis ใกล้ถึงเพดาน maxmemory หรือเมื่อ connection ค้างเกินกำหนด เพื่อให้แก้ปัญหาได้ก่อนกระทบผู้ใช้จริง การวาง Redis บน VPS ที่มีทรัพยากรเพียงพอและมอนิเตอร์อย่างสม่ำเสมอ จะช่วยให้เว็บเร็วและเสถียรในระยะยาว

สำคัญ: อย่าตั้ง maxmemory ใกล้เคียง RAM ทั้งหมดของ VPS เพราะระบบปฏิบัติการและบริการอื่น (PHP-FPM, MySQL, Nginx) ก็ต้องใช้ RAM ด้วย แนะนำให้ Redis ใช้ไม่เกิน 25–40% ของ RAM ทั้งหมด

คำถามที่พบบ่อย (FAQ)

Redis ต่างจาก Memcached อย่างไร?

ทั้งคู่เป็น in-memory cache แต่ Redis รองรับโครงสร้างข้อมูลหลากหลายกว่า (List, Hash, Set, Sorted Set), มี Persistence บันทึกลงดิสก์ได้, รองรับ Pub/Sub และ replication ขณะที่ Memcached เน้นเรียบง่ายและเบากว่าสำหรับ key-value cache ล้วน ๆ สำหรับงานส่วนใหญ่บน VPS Redis ครอบคลุมและยืดหยุ่นกว่า

VPS ต้องมี RAM เท่าไหร่ถึงจะรัน Redis ได้?

Redis เริ่มทำงานได้ด้วย RAM เพียงไม่กี่สิบ MB แต่ในการใช้งานจริงควรมี RAM อย่างน้อย 1 GB เพื่อเหลือพื้นที่ให้ทั้งระบบปฏิบัติการ, เว็บเซิร์ฟเวอร์ และ cache ของ Redis เอง AsiaGB VPS เริ่มต้นที่ 500 บาท/เดือน บน Ubuntu รองรับการรัน Redis ได้สบาย

ข้อมูลใน Redis หายไหมเมื่อ VPS reboot?

ขึ้นกับการตั้งค่า Persistence หากเปิด RDB snapshot (ค่า save) หรือ AOF ไว้ Redis จะกู้ข้อมูลคืนหลัง reboot แต่ถ้าใช้เป็น cache ล้วน ๆ ข้อมูลที่หายไม่ใช่ปัญหา เพราะระบบจะ rebuild cache จากแหล่งข้อมูลหลัก (MySQL) ใหม่เองโดยอัตโนมัติ

ทำไม Hit Rate ของ Redis ถึงต่ำ?

สาเหตุที่พบบ่อยคือ maxmemory เล็กเกินไปทำให้ key ถูก evict ออกเร็ว, TTL สั้นเกินไป หรือ application ตั้งค่า cache key ไม่สม่ำเสมอ ลองเพิ่ม maxmemory, ตรวจค่า evicted_keys และทบทวน TTL ที่แอปกำหนด มักช่วยให้ Hit Rate ดีขึ้นชัดเจน

สรุป

ต้องการ VPS สำหรับ Redis?

AsiaGB VPS Linux เริ่มต้น 500 บาท/เดือน · Full Root Access · SSD · Unlimited Bandwidth · เลือก Ubuntu ได้ทุก version

ดูแพ็กเกจ VPS

ดูแพ็กเกจ VPS ไทย ราคาถูกทั้งหมด →