
Redis คือ In-Memory Data Store ที่เก็บข้อมูลไว้ใน RAM ทำให้ดึงข้อมูลได้เร็วกว่า MySQL หรือ File System หลายร้อยเท่า เหมาะสำหรับ Session Cache, Object Cache, Queue และ Rate Limiting บทความนี้จะพาติดตั้ง Redis บน VPS Ubuntu และตั้งค่าให้ใช้งานจริงกับ PHP และ WordPress
ความต้องการระบบ
- VPS Ubuntu 20.04, 22.04 หรือ 24.04 LTS
- RAM อย่างน้อย 512 MB (แนะนำ 1 GB ขึ้นไป)
- สิทธิ์ Root หรือ User ที่มี sudo
ขั้นตอนที่ 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 10000Reload config:
systemctl restart redis-server
systemctl enable redis-servermaxmemory-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 ดีขึ้นชัดเจน
สรุป
- ติดตั้ง Redis ด้วย apt แล้วตั้งค่า maxmemory ไว้ที่ 25% ของ RAM
- ใช้ bind 127.0.0.1 เสมอ — ห้ามเปิด Redis สู่ Public Internet
- ใช้ php-redis extension ให้ PHP คุยกับ Redis ได้
- ติดตั้ง Redis Object Cache Plugin บน WordPress เพื่อลด DB Query
- Monitor ด้วย redis-cli info stats เพื่อดู Hit Rate
ต้องการ VPS สำหรับ Redis?
AsiaGB VPS Linux เริ่มต้น 500 บาท/เดือน · Full Root Access · SSD · Unlimited Bandwidth · เลือก Ubuntu ได้ทุก version
ดูแพ็กเกจ VPS