คำตอบสั้น ๆ: ติดตั้ง Redis บน Ubuntu หรือ AlmaLinux ให้รับเฉพาะการเชื่อมต่อภายในเครื่อง ตั้งรหัสผ่านด้วย ACL จำกัดหน่วยความจำ และเลือกนโยบายเมื่อข้อมูลเต็ม
คู่มือนี้อธิบาย Server ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
Redis เป็นฐานข้อมูลแบบ Key-Value ที่เก็บข้อมูลไว้ในหน่วยความจำ จึงอ่านเขียนได้เร็วมาก นิยมใช้เป็น Cache ของเว็บไซต์ (เช่น Object Cache ของ WordPress), เก็บ Session ของผู้ใช้, ทำคิวงาน (Queue) ของ Laravel หรือเก็บตัวนับต่าง ๆ การใช้ Redis ช่วยลดจำนวน Query ที่ต้องวิ่งไปยัง MySQL ได้มาก
สิ่งที่ต้องระวังคือ Redis ออกแบบมาให้ทำงานในเครือข่ายที่เชื่อถือได้ ถ้าเปิดพอร์ต 6379 ออกอินเทอร์เน็ตโดยไม่มีรหัสผ่าน ผู้ไม่หวังดีจะเข้ามาอ่าน ลบ หรือใช้ Redis เป็นช่องทางเขียนไฟล์ลงเครื่องได้ บทความนี้จึงเน้นการติดตั้งที่รับเฉพาะการเชื่อมต่อภายในเครื่อง ตั้งรหัสผ่าน และจำกัดหน่วยความจำ
สิ่งที่ต้องเตรียม
- Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9 และผู้ใช้ที่มีสิทธิ์
sudo - RAM ว่างพอสำหรับข้อมูลที่จะเก็บใน Redis (ตรวจด้วย
free -hดู ตรวจสอบ CPU, RAM และ Load Average ของ Linux Server) - แอปพลิเคชันที่จะใช้ Redis รันอยู่บนเครื่องเดียวกัน (กรณีต่างเครื่อง ดูหัวข้อท้ายบทความ)
ความแตกต่างระหว่าง Distro ที่ต้องรู้ก่อน:
| Ubuntu | AlmaLinux / Rocky 9 | AlmaLinux / Rocky 8 | |
|---|---|---|---|
| ชื่อแพ็กเกจ | redis-server | redis | redis |
| ชื่อ Service | redis-server | redis | redis |
| ไฟล์ตั้งค่า | /etc/redis/redis.conf | /etc/redis/redis.conf | /etc/redis.conf |
| ไฟล์ Log | /var/log/redis/redis-server.log | /var/log/redis/redis.log | /var/log/redis/redis.log |
เวอร์ชันของ Redis ขึ้นกับ Repository ของแต่ละ Distro (Ubuntu 22.04 ได้ 6.0, 24.04 ได้ 7.0) คำสั่งในบทความนี้ใช้ได้กับ Redis 6 ขึ้นไป
ขั้นตอนที่ 1: ติดตั้ง Redis
# Ubuntu
sudo apt update
sudo apt install -y redis-server
# AlmaLinux / Rocky Linux
sudo dnf install -y redis
sudo systemctl enable --now redis
บน AlmaLinux/Rocky 8 Module Stream เริ่มต้นคือ Redis 5 ซึ่งยังไม่มีระบบ ACL ให้เปิด Stream 6 ก่อนติดตั้ง:
sudo dnf module enable -y redis:6
sudo dnf install -y redis
บน Ubuntu Service จะเริ่มทำงานและตั้งให้เริ่มเมื่อบูตให้อัตโนมัติ ตรวจเบื้องต้นด้วย:
redis-cli ping
ต้องได้คำตอบ PONG
ขั้นตอนที่ 2: สำรองไฟล์ตั้งค่าและตรวจการ Bind
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig
(บน AlmaLinux/Rocky 8 ให้ใช้ Path /etc/redis.conf แทนทุกจุดในบทความนี้)
เปิดไฟล์แล้วตรวจค่าต่อไปนี้:
sudo nano /etc/redis/redis.conf
bind 127.0.0.1 -::1
protected-mode yes
port 6379
bind 127.0.0.1 -::1รับเฉพาะการเชื่อมต่อจากเครื่องตัวเองทั้ง IPv4 และ IPv6 เครื่องหมาย-หน้า::1หมายถึงถ้าเครื่องไม่มี IPv6 ก็ไม่ต้องแจ้ง Error รูปแบบนี้ใช้ได้เฉพาะ Redis รุ่นใหม่ ถ้าไฟล์ของแพ็กเกจที่คุณได้มาเขียนไว้เป็นbind 127.0.0.1 ::1(เช่น Redis 6.0 บน Ubuntu 22.04) ให้คงบรรทัดเดิมไว้ ทั้งสองแบบให้ผลเหมือนกันเมื่อเครื่องมี IPv6protected-mode yesเป็นชั้นป้องกันเพิ่มเติม ถ้าไม่มีรหัสผ่านและไม่ได้ Bind ไว้ Redis จะปฏิเสธการเชื่อมต่อจากภายนอก
ห้ามเปลี่ยน bind เป็น 0.0.0.0 เพื่อให้แอปเชื่อมต่อได้ ถ้าแอปอยู่บนเครื่องเดียวกัน 127.0.0.1 ก็เพียงพอ
ขั้นตอนที่ 3: ตั้งรหัสผ่านด้วย ACL
ตั้งแต่ Redis 6 มีระบบ ACL ที่แยกผู้ใช้และสิทธิ์ได้ วิธีที่ง่ายที่สุดคือตั้งรหัสผ่านให้ผู้ใช้ default ผ่านค่า requirepass ซึ่งใช้ได้ทุกเวอร์ชัน สร้างรหัสผ่านยาวแบบสุ่มก่อน:
openssl rand -base64 32 | tr -d '/+=' | cut -c1-40
แล้วใส่ในไฟล์ตั้งค่า:
requirepass ใส่รหัสผ่านที่สร้างไว้
ไฟล์ตั้งค่าเก็บรหัสผ่านเป็นข้อความธรรมดา ตรวจให้แน่ใจว่าผู้ใช้อื่นอ่านไม่ได้:
ls -l /etc/redis/redis.conf
ผู้ใช้อื่น (ตัวอักษรชุดสุดท้ายของสิทธิ์) ต้องไม่มีสิทธิ์อ่าน หากมี ให้ปรับด้วย sudo chmod 640 /etc/redis/redis.conf โดยคงเจ้าของและกลุ่มเดิมของแพ็กเกจไว้ เพื่อให้ Service ยังอ่านไฟล์ได้
หากต้องการแยกผู้ใช้ให้แต่ละแอป เช่น ให้เว็บใช้ได้เฉพาะ Key ที่ขึ้นต้นด้วย site1: และห้ามคำสั่งอันตราย ให้เพิ่มบรรทัด ACL ในไฟล์เดียวกัน:
user site1 on >รหัสผ่านของsite1 ~site1:* +@all -@dangerous
-@dangerous ตัดคำสั่งกลุ่มอันตราย เช่น FLUSHALL, CONFIG, DEBUG ออกจากผู้ใช้นี้ กลุ่มนี้รวมคำสั่ง KEYS ด้วย ก่อนใช้จริงให้ตรวจว่าแอปหรือปลั๊กอินของคุณไม่ได้เรียกคำสั่งในกลุ่มนี้
ขั้นตอนที่ 4: จำกัดหน่วยความจำและเลือกนโยบายเมื่อเต็ม
ถ้าไม่จำกัด Redis จะใช้ RAM เพิ่มไปเรื่อย ๆ จนระบบต้องฆ่าโปรเซส (OOM Killer) ซึ่งอาจไปฆ่า MySQL แทน ให้กำหนด:
maxmemory 256mb
maxmemory-policy allkeys-lru
| นโยบาย | เหมาะกับ |
|---|---|
allkeys-lru | ใช้ Redis เป็น Cache ล้วน ลบ Key ที่ไม่ได้ใช้นานที่สุดเมื่อเต็ม |
volatile-lru | มีทั้ง Cache (มีวันหมดอายุ) และข้อมูลถาวรปนกัน ลบเฉพาะ Key ที่ตั้งเวลาหมดอายุไว้ |
noeviction | ใช้เป็นคิวงานหรือ Session ที่ห้ามหาย เมื่อเต็มจะปฏิเสธการเขียนแทนการลบ |
ตัวเลข 256mb เป็นเพียงตัวอย่าง สำหรับเครื่องที่มี RAM 2 GB และรันเว็บกับฐานข้อมูลไปด้วย 128-256 MB มักเพียงพอสำหรับ Object Cache ของเว็บขนาดเล็ก
ขั้นตอนที่ 5: ตั้งค่าการบันทึกลงดิสก์
ค่าเริ่มต้นของ Redis จะบันทึก Snapshot (RDB) ลงดิสก์เป็นระยะด้วยบรรทัด save ถ้าใช้เป็น Cache ล้วนและไม่สนใจว่าข้อมูลจะหายเมื่อรีสตาร์ต สามารถปิดได้เพื่อลดการเขียนดิสก์:
save ""
ถ้าใช้เก็บ Session หรือคิวงานที่ห้ามหาย ให้คงค่า save ไว้ และพิจารณาเปิด appendonly yes ซึ่งบันทึกทุกคำสั่งเขียนลงไฟล์ AOF ทำให้สูญเสียข้อมูลน้อยที่สุดเมื่อเครื่องดับ