Dockerize WordPress: Tăng tốc Stack MariaDB và Redis Cache chuẩn Production

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

Tại sao phải Dockerize WordPress kèm Redis?

Nếu bạn từng “vã mồ hôi” khi nâng cấp PHP trên VPS và khiến website lăn đùng ra lỗi 500, Docker chính là cứu cánh. Cài đặt kiểu LAMP/LEMP truyền thống rất dễ lỗi nếu lệch phiên bản thư viện. Docker đóng gói mọi thứ vào container, đảm bảo môi trường dev và production đồng nhất 100%.

Tuy nhiên, chỉ chạy mỗi WordPress và MySQL là chưa đủ. Khi traffic tăng, database sẽ sớm trở thành nút thắt cổ chai (bottleneck). Thực tế, việc thêm Redis làm Object Cache có thể giảm thời gian phản hồi database từ hàng trăm miligiây xuống chỉ còn vài miligiây. Redis lưu kết quả truy vấn vào RAM, giúp CPU của MariaDB “dễ thở” hơn hẳn.

Đừng đợi đến khi web chậm mới lo tối ưu. Hãy xây dựng một cấu trúc chuẩn chỉnh ngay từ ngày đầu tiên.

Cấu trúc thư mục dự án

Quản lý file khoa học giúp bạn tránh rắc rối khi backup hoặc di chuyển server. Mình thường tách biệt code, data và cấu hình rõ ràng.

my-wordpress-site/
├── docker-compose.yml
├── .env
├── wordpress_data/ 
└── mariadb_data/

Thiết lập file Docker Compose “thực chiến”

Hiện tại mình đã chuyển hẳn sang Docker Compose v2. Thay vì dùng lệnh docker-compose up cũ kỹ, cú pháp mới là docker compose up. Bản v2 xử lý tài nguyên mượt mà và nhanh hơn đáng kể.

Dưới đây là file cấu hình mình thường dùng cho các dự án thực tế. Mình chọn MariaDB 10.11 vì nó tiêu tốn ít RAM hơn MySQL nhưng hiệu năng xử lý query lại nhỉnh hơn trong môi trường container.

services:
  db:
    image: mariadb:10.11
    container_name: wp_mariadb
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./mariadb_data:/var/lib/mysql
    networks:
      - wp_network

  redis:
    image: redis:7-alpine
    container_name: wp_redis
    restart: always
    networks:
      - wp_network

  wordpress:
    depends_on:
      - db
      - redis
    image: wordpress:latest
    container_name: wp_app
    restart: always
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: ${DB_USER}
      WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
      WORDPRESS_DB_NAME: ${DB_NAME}
      WORDPRESS_CONFIG_EXTRA: |
        define('WP_REDIS_HOST', 'redis');
        define('WP_REDIS_PORT', 6379);
        define('WP_CACHE', true);
    volumes:
      - ./wordpress_data:/var/www/html
    networks:
      - wp_network

networks:
  wp_network:
    driver: bridge

Những điểm cần lưu ý:

  • WORDPRESS_CONFIG_EXTRA: Tính năng này cực hay của image WordPress chính thức. Nó tự động chèn cấu hình Redis vào file wp-config.php mà bạn không cần mở file sửa thủ công.
  • Isolated Network: Network wp_network giúp các container giao tiếp nội bộ. Database không cần mở port ra ngoài, tránh bị hacker scan port 3306.
  • Alpine Image: Bản redis:7-alpine chỉ nặng khoảng vài chục MB, giúp tiết kiệm dung lượng ổ cứng tối đa.

Quản lý biến môi trường với file .env

Tuyệt đối không viết thẳng mật khẩu vào file compose nếu bạn định đẩy code lên GitHub. Hãy tạo file .env cùng cấp để lưu các thông số nhạy cảm:

DB_ROOT_PASSWORD=mat_khau_root_sieu_kho
DB_NAME=wordpress_db
DB_USER=wp_admin
DB_PASSWORD=mat_khau_nguoi_dung

Kích hoạt Redis trong Dashboard WordPress

Sau khi chạy docker compose up -d, web của bạn sẽ online tại port 8080. Tuy nhiên, Redis chưa tự chạy ngay được. Bạn cần làm thêm 3 bước:

  1. Đăng nhập vào wp-admin.
  2. Tìm và cài đặt plugin Redis Object Cache.
  3. Vào Settings -> Redis và nhấn “Enable Object Cache”.

Khi thấy trạng thái “Connected”, nghĩa là Redis đã bắt đầu nhận cache. Tốc độ load trang lúc này sẽ nhanh hơn thấy rõ.

Mẹo tối ưu và bảo mật thực tế

1. Giới hạn tài nguyên

WordPress có thể “ngốn” sạch RAM server nếu bị bot scan liên tục. Hãy giới hạn tài nguyên ngay trong file compose. Mức 512MB RAM là con số hợp lý cho một blog cá nhân ổn định.

deploy:
  resources:
    limits:
      cpus: '0.50'
      memory: 512M

2. Xử lý lỗi phân quyền (Permissions)

Nếu không thể upload ảnh, khả năng cao là do lệch UID. Trên Linux, hãy chạy lệnh chown -R 33:33 wordpress_data. Lệnh này giúp user www-data bên trong container có toàn quyền ghi dữ liệu.

3. Chiến lược Backup

Đừng phó mặc hoàn toàn cho Docker volumes. Bạn nên lập lịch cronjob để dump database định kỳ mỗi ngày một lần. Một file .sql nhỏ gọn sẽ cứu cánh bạn khi server gặp sự cố phần cứng.

Tổng kết

Kết hợp MariaDB và Redis vào Docker stack giúp WordPress vận hành mượt mà và dễ quản lý hơn. Tận dụng WORDPRESS_CONFIG_EXTRA là cách nhanh nhất để tự động hóa mọi thứ. Chúc các bạn build được hệ thống chịu tải tốt và ổn định!

Share: