Chuyên mục
Linux Virtualization Wordpress

Tích hợp Redis Cache và Memcached vào OpenLiteSpeed Docker

Hồi tháng 03/2022, mình đã tiến hành thử nghiệm chạy WordPress trên nền Docker + OpenLiteSpeed cho các website nhỏ. Sau vài tháng theo dõi, thấy tất cả đều hoạt động mượt mà, mình đã quyết định đóng gói hết tất cả các website WordPress lớn còn lại qua chạy trên Docker luôn.

Tuy nhiên, lúc này mình mới phát hiện ra thiết lập mặc định của OpenLiteSpeed Docker đang bị thiếu Redis Cache và Memcached – hai công cụ làm bộ nhớ đệm giúp tăng tốc độ xử lý cũng như làm giảm tần suất truy cập vào database cho WordPress.

Dưới đây là cách tích hợp thêm Redis Cache và Memcached vào hệ thống OpenLiteSpeed Docker.

I. Cài đặt Redis Cache

1. Khai báo và kích hoạt Redis

Chỉnh sửa file docker-compose.yml trong thư mục ols-docker-env và bổ sung thêm đoạn này ở cuối

redis:
    image: docker.io/bitnami/redis:7.0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    #ports:
    #  - '6379:6379'
    restart: always
    volumes:
      - 'redis:/bitnami/redis/data'

volumes:
  redis:
    driver: localCode language: YAML (yaml)

Mình thêm # vào trước phần khai báo ports để không mở kết nối từ bên ngoài vào container chạy Redis. Chỉ có container OpenLiteSpeed nằm trong cùng mạng Docker mới có quyền truy cập vào container Redis này.

File docker-compose.yml sau khi chỉnh sửa sẽ tương tự như sau

version: '3'
services:
  mysql:
    image: mariadb:10.5.9
    logging:
      driver: none
    command: --max_allowed_packet=256M
    volumes:
      - "./data/db:/var/lib/mysql:delegated"
    ports:
       - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: always
  litespeed:
    image: litespeedtech/openlitespeed:${OLS_VERSION}-${PHP_VERSION}
    build: ./custom
    logging:
      driver: none
    env_file:
      - .env
    volumes:
        - ./lsws/conf:/usr/local/lsws/conf
        - ./lsws/admin-conf:/usr/local/lsws/admin/conf
        - ./bin/container:/usr/local/bin
        - ./sites:/var/www/vhosts/
        - ./acme:/root/.acme.sh/
        - ./logs:/usr/local/lsws/logs/
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
      - 7080:7080
    restart: always
    environment:
      TZ: ${TimeZone}
  redis:
    image: docker.io/bitnami/redis:7.0
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    #ports:
    #  - '6379:6379'
    restart: always
    volumes:
      - 'redis:/bitnami/redis/data'

volumes:
  redis:
    driver: localCode language: YAML (yaml)

Kích hoạt lại hệ thống để tạo thêm container Redis

docker-compose up -d

2. Tìm IP Address của Redis Container

Chúng ta cần tìm ra IP Address của Redis Container để khai báo trong plugin LiteSpeed Cache ở bước sau.

Liệt kê danh sách các container đang hoạt động

docker psCode language: Nginx (nginx)

Kết quả trả về

thuanbui@debian:~$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED             STATUS             PORTS                                                                                                                                                        NAMES
29a0b87f0b19   bitnami/memcached:1                          "/opt/bitnami/script…"   About an hour ago   Up About an hour   0.0.0.0:11211->11211/tcp, :::11211->11211/tcp                                                                                                                ols-docker-env_memcached_1
0babcaee5704   mariadb:10.5.9                               "docker-entrypoint.s…"   36 hours ago        Up 36 hours        0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                                                                                                    ols-docker-env_mysql_1
e329dffb521f   litespeedtech/openlitespeed:1.7.15-lsphp74   "/entrypoint.sh"         37 hours ago        Up 37 hours        0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:7080->7080/tcp, :::7080->7080/tcp, 0.0.0.0:443->443/udp, :::443->443/udp   ols-docker-env_litespeed_1
2822935a82d7   bitnami/redis:7.0                            "/opt/bitnami/script…"   37 hours ago        Up 37 hours        6379/tcp                                                                                                                                                     ols-docker-env_redis_1Code language: YAML (yaml)

Tìm IP Address của container Redis (ID: 2822935a82d7)

docker inspect 2822935a82d7 | grep -i IPAddressCode language: Nginx (nginx)

IP Address: 172.20.0.4

3. Cấu hình Object Cache

Truy cập vào website WordPress đang chạy trên hệ thống, truy cập vào phần cấu hình Object Cache của plugin LiteSpeed Cache và cấu hình như dưới đây. Sau đó bấm Save changes, nếu thấy dòng Connection Test ghi Passed nghĩa là Redis đã hoạt động ngon lành.

4. Xác nhận Redis Cache đang chạy

Quay trở lại Terminal, kiểm tra Redis Cache có đang chạy hay không bằng lệnh sau

 docker exec -it ols-docker-env_redis_1 redis-cli monitorCode language: Bash (bash)

Bạn có thể cần phải thay ols-docker-env_redis_1 bằng tên của Container Redis đang chạy. Dùng lệnh docker ps để kiểm tra tên của Container.

Kế tiếp, truy cập vào website bằng trình duyệt, nếu thấy màn hình liên tục cập nhật các thông số như hình sau nghĩa là Redis Cache đã được cấu hình chính xác và hoạt động trơn tru.

II. Cài đặt Memcached

1. Khai báo và kích hoạt Memcached

Tương tự như trên, mình sẽ khai báo thêm Memcached trong file docker-compose.yml. Sau khi chỉnh sửa file sẽ như sau

version: '3'
services:
  mysql:
    image: mariadb:10.5.9
    logging:
      driver: none
    command: --max_allowed_packet=256M
    volumes:
      - "./data/db:/var/lib/mysql:delegated"
    ports:
       - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: always
  litespeed:
    image: litespeedtech/openlitespeed:${OLS_VERSION}-${PHP_VERSION}
    build: ./custom
    logging:
      driver: none
    env_file:
      - .env
    volumes:
        - ./lsws/conf:/usr/local/lsws/conf
        - ./lsws/admin-conf:/usr/local/lsws/admin/conf
        - ./bin/container:/usr/local/bin
        - ./sites:/var/www/vhosts/
        - ./acme:/root/.acme.sh/
        - ./logs:/usr/local/lsws/logs/
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
      - 7080:7080
    restart: always
    environment:
      TZ: ${TimeZone}
  memcached:
    #image: launcher.gcr.io/google/memcached1
    image: docker.io/bitnami/memcached:1
    ports:
      - '11211:11211'
Code language: YAML (yaml)

Kích hoạt lại hệ thống

docker-compose up -d

2. Tìm IP Address của Redis Container

Chúng ta cần tìm ra IP Address của Memcached Container để khai báo trong plugin LiteSpeed Cache ở bước sau.

Liệt kê danh sách các container đang hoạt động

docker psCode language: Nginx (nginx)

Kết quả trả về

thuanbui@debian:~$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED             STATUS             PORTS                                                                                                                                                        NAMES
29a0b87f0b19   bitnami/memcached:1                          "/opt/bitnami/script…"   About an hour ago   Up About an hour   0.0.0.0:11211->11211/tcp, :::11211->11211/tcp                                                                                                                ols-docker-env_memcached_1
0babcaee5704   mariadb:10.5.9                               "docker-entrypoint.s…"   36 hours ago        Up 36 hours        0.0.0.0:3306->3306/tcp, :::3306->3306/tcp                                                                                                                    ols-docker-env_mysql_1
e329dffb521f   litespeedtech/openlitespeed:1.7.15-lsphp74   "/entrypoint.sh"         37 hours ago        Up 37 hours        0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:7080->7080/tcp, :::7080->7080/tcp, 0.0.0.0:443->443/udp, :::443->443/udp   ols-docker-env_litespeed_1
2822935a82d7   bitnami/redis:7.0                            "/opt/bitnami/script…"   37 hours ago        Up 37 hours        6379/tcp                                                                                                                                                     ols-docker-env_redis_1Code language: YAML (yaml)

Tìm IP Address của container Memcached (ID: 29a0b87f0b19)

docker inspect 29a0b87f0b19 | grep -i IPAddressCode language: Nginx (nginx)

IP Address: 172.20.0.5

3. Cấu hình Object Cache dùng Memcached

Khai báo như dưới đây và lưu lại, thấy dòng Connection Test: Passed nghĩa là Memcached đã hoạt động ổn.


Bạn không cần phải cài đặt cả hai công cụ Redis và Memcached. Vì bạn chỉ chọn 1 trong 2 để sử dụng làm Object Cache cho WordPress. Mình thì luôn chọn Redis Cache.

Chúc bạn thực hiện thành công!

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

4 trả lời trong “Tích hợp Redis Cache và Memcached vào OpenLiteSpeed Docker”

Trang của anh có nhiều bài khá hay. Anh cho em hỏi hiện anh đang chạy trang web trên VPS như thế nào? Dùng Script như HOCVPS hay tự cài những cái thích hợp.

Kiểu người mới muốn sử dụng về VPS để chạy trang web thì cần cài những gì? Trên site anh có bài viết nào như thế không?

Mong sớm nhận được phản hồi từ anh….

Khi server khởi động lại redis container sẽ tự động bị assign IP khác, vì vậy cấu hình trong wordpress lại phải sửa lại.
Mong bạn hướng dẫn cách bind ip cho container để tránh trường hợp trên.
Cảm ơn bạn rất nhiều

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *