Chuyên mục
Network Virtualization

Cấu hình Nginx Proxy Manager làm Reverse Proxy cho OpenLiteSpeed + MariaDB + Docker

Trong bài viết hướng dẫn cài đặt WordPress + MariaDB + OpenLiteSpeed + PhpMyAdmin sử dụng Docker Compose, có một bạn đã thắc mắc: “Làm sao để cài đặt OpenLiteSpeed + Docker trên máy chủ đã cài đặt sẵn Nginx Proxy Manager?” Mục đích nhằm sử dụng NPM làm reverse proxy cho các dịch vụ khác trên cùng máy chủ.

Bài viết này mình sẽ hướng dẫn cách cấu hình Nginx Proxy Manager (viết tắt: NPM) và OpenLiteSpeed Docker (viết tắt: OLS) hoạt động song song trên cùng 1 máy chủ.

Trước khi đọc tiếp, yêu cầu bạn cần phải nắm rõ về cách cài đặt và sử dụng NPM và OLS:

1. Vấn đề hiện tại & giải pháp

Theo cấu hình mặc định trong bài hướng dẫn cài đặt NPM và OLS mình đã chia sẻ trước đây, cả hai dịch vụ này đều sử dụng cổng 80 và 443 của máy chủ. Do đó, chỉ có thể kích hoạt 1 trong 2 em: em nào chạy trước sẽ xí 2 cổng 80 và 443, em nào chạy sau sẽ bị báo lỗi cổng đã bị chiếm dụng.

Trên thực tế, chúng ta có thể loại bỏ hoàn toàn NPM và sử dụng luôn OLS làm reverse proxy. Tuy nhiên cách cấu hình reverse proxy cho OLS không trực quan, dễ hiểu như bên NPM nên hiện tại mình sẽ bỏ qua cách này. Hẹn 1 ngày đẹp trời sẽ chia sẻ cách cấu hình OLS làm reverse proxy sau.

Giải pháp duy nhất là sử dụng NPM làm revese proxy chính trên máy chủ, được ưu tiên dùng cổng 80 và 443. Mình sẽ thay đổi cấu hình bên OLS để tránh đụng chạm.

2. Tạo Docker network

Đầu tiên, mình sẽ tạo 1 mạng Docker ảo. Tất cả các dịch vụ mạng được kích hoạt bằng Docker trên cùng máy chủ sẽ được kết nối vào mạng ảo này. Bằng các thiết lập mạng riêng, chúng ta không cần publish các cổng mạng của dịch vụ ra ngoài. Chỉ duy nhất cổng 80 và 443 của NPM được truy cập từ bên ngoài.

docker network create thuanbuidepchaiCode language: Nginx (nginx)

3. Cập nhật cấu hình OLS

Truy cập vào thư mục cài đặt OLS và thay đổi file cấu hình docker-compose.yml của ols-docker-env

  • Thêm dấu # vào trước các phần cấu hình port để vô hiệu hoá.
  • Thêm thông số mạng vào dưới cùng như sau
networks:
  default:
    external:
      name: thuanbuidepchaiCode language: YAML (yaml)

Sau khi thay đổi, file docker-compose.yml của mình sẽ như dưới đây

version: '3'
services:
  mysql:
    image: mariadb:10.5.9
    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:
    container_name: litespeed
    image: litespeedtech/openlitespeed:${OLS_VERSION}-${PHP_VERSION}
    build: ./custom
    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:
    #  - 8080:80
    #  - 4443:443
    #  - 4443:443/udp
    #  - 7080:7080
    restart: always
    environment:
      TZ: ${TimeZone}

networks:
  default:
    external:
      name: thuanbuidepchaiCode language: YAML (yaml)

Kích hoạt lại OLS bằng lệnh

docker-compose up -d

4. Cập nhật cấu hình NPM

Truy cập vào thư mục cài NPM và chỉnh lại docker-compose.yml: thêm vào thông số network tương tự như ở trên

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

networks:
  default:
    external:
      name: thuanbuidepchaiCode language: YAML (yaml)

Kích hoạt lại NPM

docker-compose up -d

Mở trình duyệt web, truy cập vào địa chỉ IP của máy chủ, nếu hiện ra trang web như sau nghĩa là bạn đang đi đúng hướng: NPM đang đóng vai trò làm Reverse Proxy cho máy chủ.

5. Tạo Proxy Host

Tiếp theo, chúng ta cần phải tạo Proxy Host trên NPM để chuyển hướng truy cập web từ bên ngoài vào OLS.

Để minh hoạ dễ hiểu, mình tạo thêm 1 tên miền con testingols.thuanbui.me, trỏ A record về IP của máy chủ. Sau khi chỉnh DNS xong, truy cập vào địa chỉ https://testingols.thuanbui.me, trình duyệt sẽ hiện ra trang chủ mặc định của NPM.

MÌnh cần truy cập vào trang admin của NPM để tạo Proxy Host, chuyển hướng cho nó về OLS.

  • Domain Names: testingols.thuanbui.me
  • Scheme: http
  • Forward Hostname / IP: litespeed (tên của Docker container mình ghi ở dòng 17 trong phần cấu hình OLS ở trên)
  • Forward Port: 80

Bấm qua mục SSL để tạo chứng chỉ bảo mật SSL Let’s Encrypt cho tên miền. Sau đó bấm Save.

Truy cập lại địa chỉ https://testingols.thuanbui.me, bạn sẽ thấy trình duyệt báo lỗi 404 như dưới đây.

Không sao cả! Lỗi này hiện ra là do chúng ta chưa thiết lập Virtual Host trong OLS (sẽ làm ở bước kế tiếp). Chỉ cần trình duyệt hiện ra kết nối bảo mật SSL trơn tru là ổn, yên tâm Let’s Encrypt đã được thiết lập chuẩn trên NPM.

6. Tạo Virtual Host trên OLS

Bạn làm theo hướng dẫn từ Bước IV. Thêm tên miền và virtual hosts trong bài viết hướng dẫn cài đặt OLS.

Lưu ý: bạn cần bỏ qua bước V. Tạo chứng chỉ SSL vì kết nối bảo mật SSL đã được đảm nhiệm bởi NPM.

Sau khi hoàn tất bước tạo WordPress, truy cập lại vào tên miền https://testingols.thuanbui.me, trang cài đặt WordPress sẽ hiện ra. Bravoo!

Nếu cần tạo thêm nhiều trang web WordPress khác, bạn lập lại thao tác ở bước 5 và 6 là xong.

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

14 trả lời trong “Cấu hình Nginx Proxy Manager làm Reverse Proxy cho OpenLiteSpeed + MariaDB + Docker”

Chào Thuận,

Mình đã thực hiện thành công tất cả các bước (trừ bước 6 & 7). Mình có cài đặt portainer, và có tạo proxy host của portainer vào npm, tuy nhiên lúc đăng ký ssl thì báo lỗi “internal error”. Mình có dùng chức năng Test Server Reachability của npm, thì nhận được thông báo như hình https://ibb.co/vDcLYbF . Mình có thử thêm kết nối mới mà mình đã tạo từ Docker network. Không biết như vậy có đúng không nữa. Danh sách kết nối ols và nix vào npm và có ssl. Duy chỉ có portainer (port) là không tạo được ssl https://ibb.co/BrZnsb1

Lỗi Internal Error khi tạo SSL là do DNS của Tên miền chưa trỏ về IP của Nginx Proxy Manager, Let’s Encrypt hông xác thực được tên miền. Bạn cần kiểm tra lại IP của tên miền có phải là IP đang cài đặt NPM không rồi mới tạo SSL được.

Cho mình hỏi về việc chạy phpmyadmin trong OLP docker dưới NPM, mình đăng nhập với thông số như trong .env nhưng báo lỗi kết nối mạng, nếu dùng terminal thì wp cli có dùng được với các cms khác không hay chỉ cho wordpress thôi?

WP-CLI chỉ dùng cho WordPress được thôi bạn nhé.
Còn vụ phpmyadmin thì bạn xem lại phần cấu hình xem có sai gì không nhé. Mình không dùng phpmyadmin trong bộ OLS Docker nên chưa test bao giờ.

Chào bạn, cảm ơn bạn về bài viết chia sẻ tuyệt vời.
Mình muốn hỏi một chút là hiện giờ mình thấy trên mạng có nhiều bài viết hướng dẫn quá. Ví dụ cài mình nginx, cài mình ols, cài nginx reverse proxy apache hay cài nginx proxy ols. Bạn có thể chia sẻ cho mình theo quan điểm cá nhân bạn thì cái nào hiệu năng và hiệu quả tốt nhất được không ạ. Hoặc có trang web nào tiếng anh để tìm hiểu bạn chia sẻ mình với. Nếu có thể bạn làm các bài test hiệu năng độ chịu tải của các phương pháp này thì tuyệt vời quá.

0

Bạn google “Nginx vs Openlitespeed” sẽ ra rất nhiều kết quả để tham khảo. Theo mình thì không có cái nào được gọi là tốt nhất cả, vì tuỳ theo nhu cầu sử dụng sẽ chọn 1 tech stack khác nhau. Mình trước đây dùng nginx (Centminmod) nhưng sau này đã chuyển qua dùng Openlitespeed.

Mình không để ý đến network khi tạo docker. Nên giờ các container cứ loạn cào cào lên
Ví dụ như copy cái bộ 3 Pihole, unbound và Wireguard thì trong wirehole-ui_private_network
có địa chỉ IP 10.2.0.0/24
Trong khi đó NPM và NPM_db thì trong 172.21.0.x
Portainer trong 172.17.0.x
Mình thử vào portainer, login vào shell của NPM để ping về Wireguard thì không được. Mình thử login vào web quản lý NPM thêm Forward Hostname/IP thì thêm địa chỉ IP 10.2.0.x nhưng không trỏ thành công. Trong khi đó nếu đánh địa chỉ IP VPS:51821 thì vẫn vào bình thường.

Theo như bạn ghi thì hệ thống loạn cào cào vậy là đúng rồi. Mỗi group docker compose nó sẽ tạo 1 subnet riêng, và các subnet này không thông với nhau nên ping sẽ không được. Đó là lý do trong bài viết ở trên mình mới hướng dẫn tạo 1 docker network mới rồi cho tất các các container kết nối vào network này.

Đúng rồi. Mình ko follow tác giả về phần network trong file docker compose.
Xong rồi thì loạn cào cào lên. Giờ cách tốt nhất là stop lại các container rồi remove chúng đi. Sửa lại file docker compose rồi chạy lại hay là dùng cách nào gán lại subnet ?

Bạn không cần stop và remove gì cả. Cứ giữ nguyên các container như cũ, chỉ cần chỉnh sửa lại file docker compose phần network, roi sau đó kích hoạt lại bằng docker compose up -d là các container sẽ được kết nối vào network mới.

1

Cảm ơn bạn về bài chia sẻ tuyệt vời! Mình đã thực hiện tất cả các bước và trang WordPress đã hoạt động.
Tuy nhiên, mình gặp vấn đề khi cố gắng đặt chế độ SSL/TLS encryption là Full trong Cloudflare. Trang WordPress của mình xuất hiện lỗi 400 Bad Request, và một số subdomain khác gặp phải lỗi SSL handshake failed với mã lỗi 525. Bạn cho mình hỏi là có cần setup thêm gì không hay cứ để Flexible là được, tại minh thấy để Full thì có vẻ an toàn hơn.
Xin cảm ơn!

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 *