Hướng dẫn cài đặt và tối ưu Redis Server trên Ubuntu 24.04: In-Memory Cache và bảo mật

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Khi traffic chạm mốc vài chục nghìn request mỗi phút, database quan hệ như PostgreSQL hay MySQL thường là điểm nghẽn đầu tiên. Các câu lệnh JOIN phức tạp có thể mất từ 50ms đến 200ms để phản hồi. Đưa một tầng in-memory cache vào giữa ứng dụng và cơ sở dữ liệu sẽ giải quyết bài toán này. Với độ trễ đọc ghi chỉ khoảng 0.5ms đến 2ms, Redis là lựa chọn quen thuộc nhất hiện nay.

So sánh các cách triển khai Redis trên Ubuntu

Trước khi bắt tay vào cấu hình, bạn cần chọn phương án cài đặt phù hợp với hạ tầng. Trên Ubuntu 24.04 LTS (Noble Numbat), chúng ta có 3 hướng tiếp cận phổ biến:

  • Cài trực tiếp qua APT (Native Service): Dùng gói chính thức từ Redis Labs, quản lý tiến trình qua systemd.
  • Chạy qua Docker Container: Đóng gói service độc lập, quản lý qua Docker Engine hoặc Docker Compose.
  • Tự biên dịch từ mã nguồn (Build from source): Tải tarball từ trang chủ, compile bằng gcc và make.

Phân tích ưu và nhược điểm từng phương pháp

Dưới đây là bảng so sánh cụ thể giữa ba cách triển khai:

Tiêu chí Native APT (Khuyên dùng) Docker Container Compile từ Source
Hiệu năng & Tài nguyên Tối đa. Không tốn RAM chạy container engine, I/O memory bus trực tiếp. Độ trễ mạng bridge cao hơn native khoảng 5-10% nếu không cấu hình host network. Hiệu năng cao nhất do có thể bật cờ tối ưu riêng cho kiến trúc CPU.
Bảo trì & Update Rất nhẹ nhàng. Nâng cấp phiên bản chỉ với một lệnh apt upgrade redis-server. Cần theo dõi image tag, volume dữ liệu và quản trị daemon Docker đi kèm. Phức tạp. Mỗi bản vá đều phải tải source mới, build lại và cấu hình thủ công.
Quản lý tiến trình Tự động tích hợp sâu với systemd và journald. Phụ thuộc vào restart policy của Docker daemon. Phải tự viết file unit redis.service từ đầu.

Nên chọn phương án nào cho Server của bạn?

Nếu hệ thống chạy kiến trúc microservices phân tán trên Kubernetes, Docker rõ ràng tiện lợi hơn. Ngược lại, nếu bạn vận hành một VPS chạy ứng dụng monolith (Laravel, Node.js, Django) hoặc dựng dedicated cache server, hãy chọn Native APT.

Phương án này giúp bạn tận dụng tối đa RAM của máy chủ. Bạn không cần bận tâm đến overhead 150-200MB của Docker daemon. Việc theo dõi service qua systemctl cũng thuận tiện hơn rất nhiều.

Các bước cài đặt và cấu hình Redis trên Ubuntu 24.04

Dưới đây là quy trình 6 bước để dựng Redis Server an toàn, sẵn sàng phục vụ môi trường thực tế.

Bước 1: Cài đặt Redis từ kho chính thức của Redis.io

Kho mặc định của Ubuntu 24.04 thường đóng băng ở bản cũ hơn. Để nhận bản vá lỗi và cải tiến mới nhất, bạn nên lấy gói trực tiếp từ repo của Redis.io:

# Cài đặt các công cụ tải và xác thực kho lưu trữ
sudo apt update
sudo apt install -y lsb-release curl gpg

# Tải và thêm Redis GPG key vào hệ thống
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

# Khai báo repository chính thức của Redis
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

# Cập nhật danh sách gói và cài đặt
sudo apt update
sudo apt install -y redis-server

Bước 2: Cấu hình giới hạn RAM và chính sách dọn dẹp (Eviction Policy)

Theo mặc định, Redis không giới hạn dung lượng RAM tiêu thụ. Khi bộ nhớ đầy, Linux OOM (Out-Of-Memory) Killer sẽ tự động tắt các tiến trình nặng nhất trên server, thường là MySQL hoặc chính Redis.

Mở file cấu hình:

sudo nano /etc/redis/redis.conf

Tìm và cấu hình hai thông số sau (ví dụ cấp 2GB RAM cho Redis trên VPS 4GB):

# Giới hạn tối đa RAM Redis được dùng
maxmemory 2gb

# Chính sách đẩy dữ liệu cũ khi chạm trần RAM
maxmemory-policy allkeys-lru

Nếu bạn dùng Redis thuần làm bộ nhớ đệm, allkeys-lru là lựa chọn hợp lý nhất. Thuật toán này sẽ xóa các key ít được gọi gần đây để nạp key mới. Trường hợp bạn lưu cả session hoặc token đăng nhập (không muốn bị xóa nhầm), hãy đổi sang volatile-lru để chỉ dọn key có gắn hạn TTL.

Bước 3: Khóa chặt bảo mật cổng truy cập

Các botnet như Kinsing hay Redigo liên tục quét cổng 6379 trên Internet để tìm Redis mở và chiếm quyền root server. Hai thiết lập sau là bắt buộc:

  1. Chỉ lắng nghe trên Localhost (hoặc IP Private nội bộ):

    Kiểm tra dòng bind trong /etc/redis/redis.conf để chắc chắn Redis không lắng nghe trên 0.0.0.0:

    bind 127.0.0.1 -::1
    protected-mode yes
    
  2. Đặt mật khẩu xác thực (Requirepass):

    Bỏ dấu comment # ở dòng requirepass và đặt chuỗi mật khẩu ngẫu nhiên trên 30 ký tự:

    requirepass c8F29aKx91LmP30qWs7TvYbRtU4VnZ5e!
    

Bước 4: Tinh chỉnh Linux Kernel cho Redis

Khi Redis lưu snapshot (bản chụp dữ liệu) xuống ổ cứng qua cơ chế fork(), tiến trình con cần cấp phát bộ nhớ ảo tương đương tiến trình cha. Nếu thiếu RAM trống, tiến trình này sẽ thất bại. Hãy bật vm.overcommit_memory = 1 để khắc phục cảnh báo log:

# Áp dụng ngay lập tức vào Kernel đang chạy
sudo sysctl vm.overcommit_memory=1

# Ghi vào file cấu hình để giữ nguyên giá trị sau khi reboot server
echo 'vm.overcommit_memory = 1' | sudo tee -a /etc/sysctl.conf

Bước 5: Áp dụng thay đổi và bật tự khởi động cùng OS

Sau khi sửa file config, bạn cần khởi động lại tiến trình để các giá trị mới có hiệu lực:

# Khởi động lại Redis service
sudo systemctl restart redis-server

# Thiết lập tự chạy khi boot server
sudo systemctl enable redis-server

# Kiểm tra trạng thái
sudo systemctl status redis-server

Màn hình hiển thị dòng chữ xanh Active: active (running) kèm uptime nghĩa là service đã hoạt động bình thường.

Bước 6: Kiểm tra kết nối và bảo mật với Redis CLI

Mở terminal và kiểm tra phản hồi từ CLI để chắc chắn mật khẩu đã kích hoạt:

redis-cli

Thao tác kiểm tra quyền truy cập và lưu dữ liệu mẫu:

# Gửi lệnh ping khi chưa đăng nhập
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.

# Xác thực với mật khẩu vừa đặt
127.0.0.1:6379> auth c8F29aKx91LmP30qWs7TvYbRtU4VnZ5e!
OK

# Ghi và đọc thử một key
127.0.0.1:6379> set user:1001 "Nguyen Van A"
OK
127.0.0.1:6379> get user:1001
"Nguyen Van A"

# Thoát khỏi redis-cli
127.0.0.1:6379> exit

Xử lý sự cố thường gặp (Troubleshooting)

Nếu lệnh restart báo lỗi, bạn không nên đoán mò nguyên nhân. Hãy mở log thời gian thực của systemd để đọc thông báo chi tiết:

sudo journalctl -u redis-server -e --no-pager

Các lỗi phổ biến nhất thường gặp gồm:

  • Gõ sai cú pháp hoặc nhầm khoảng trắng trong /etc/redis/redis.conf.
  • Cổng 6379 đang bị một tiến trình khác (hoặc container Redis cũ) chiếm dụng.
  • Quyền sở hữu thư mục dữ liệu /var/lib/redis bị đổi sang tài khoản root thay vì user redis.

Chỉ cần làm đúng các bước trên, bạn đã có một Redis Server chuẩn chỉnh: chạy mượt mà, tự giải phóng RAM an toàn và được bảo vệ chặt chẽ trước các đợt scan cổng tự động.

Share: