Xây dựng trang WordPress bằng OpenLiteSpeed Docker và Cloudflare Tunnel

Trước đây mình đã làm bài hướng dẫn cách xây dựng và bảo mật trang WordPress bằng OpenLiteSpeed và Cloudflare bằng cách cài đặt OpenLiteSpeed trực tiếp lên máy chủ Ubuntu. Mặc dù cách cài đặt này rất đơn giản, nhanh chóng và cho hiệu năng ổn định, nhưng vẫn còn một hạn chế mà sau này mới phát sinh. Đó là khi mình phải di chuyển trang WordPress của mình sang một máy chủ khác (do mình tìm được nhà cung cấp VPS giá rẻ hơn hehe).

Tuy mình đã sử dụng UpdraftPlus để sao lưu toàn bộ trang WordPress ở máy chủ cũ và khôi phục lại ở máy chủ mới rất hiệu quả, nhưng các thiết lập khác như cấu hình về SSL, PHP Override, firewall… mình đều phải làm lại hết. Rõ ràng như vậy là chưa tối ưu vì có thể mình bỏ sót một thiết lập nào đó mà mình không nhớ. Do dó, mình quyết định chuyển toàn bộ trang của mình sang dùng Docker trên máy chủ mới, đồng thời sẽ kết hợp với sử dụng Cloudflare Tunnel để không cần phải mở port trên server, nhờ đó giúp máy chủ của mình bảo mật hơn.

Tại sao là Docker?

Nếu bạn chưa rõ Docker là gì thì mình sẽ nói ngắn gọn nó là một hệ điều hành ảo giúp đóng gói các ứng dụng vào các thùng chứa (container) mà trong đó sẽ bao gồm tất cả các thư viện, ứng dụng liên quan và các cấu hình cần thiết để có thể chạy ứng dụng đó mà không cần phải cải đặt gì thêm khi chạy nó ở một máy khác. Ví dụ khi mình sử dụng container OpenLiteSpeed, mọi ứng dụng liên quan đến OpenLiteSpeed như LiteSpeed web server, database (MariaDB), trình quản lý chứng chỉ SSL (Acme), trình quản lý cơ sở dữ liệu (phpMyAdmin)… đều được đóng gói trong container này và chúng đã được cấu hình sẵn để kết nối với nhau. Khi đó, tất cả những thay đổi, cấu hình do mình thực hiện đều được lưu lại trong container này, và khi cần di chuyển qua một máy chủ mới thì mình chỉ cần chép nguyên cái container đó qua là có thể tiếp tục sử dụng mà không cần phải cấu hình lại. Dĩ nhiên những lợi ích của Docker không chỉ dừng ở đây, nhưng vì bài này mình chỉ tập trung vào việc giải quyết vấn đề di chuyển máy chủ cho trang blog của mình nên mình chỉ nói đến đây thôi.

Dưới đây là các bước mình đã thực hiện:

1. Điều kiện tiên quyết

Để có thể thực hiện các bước bên dưới, bạn cần phải thỏa các điều kiện sau:

2. Cài đặt Docker lên máy chủ Ubuntu

Có nhiều cách để cài đặt Docker lên máy chủ Ubuntu nhưng mình sẽ sử dụng cách dễ nhất là chạy script bằng câu lệnh sau:

$ cd ~
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh

Sau khi Docker cài đặt thành công mình thực hiện tiếp lệnh sau để sử dụng Docker mà không cần phải thêm tiền tố ‘sudo’ trước các câu lệnh:

 $ sudo usermod -aG docker $USER 

Sau đó mình logout ra khỏi Ubuntu bằng lệnh:

$ logout

Rồi đăng nhập vô lại là xong.

Cách cài đặt Docker mình đã tham khảo tại link này: https://docs.docker.com/engine/install/ubuntu/

3. Cài đặt OpenLiteSpeed bằng Docker

Cũng có nhiều cách để cài container OpenLIteSpeed, nhưng mình chọn cài đặt bằng script luôn cho nhanh.

Đầu tiên thực hiện lệnh sau:

$ cd ~
$ git clone https://github.com/litespeedtech/ols-docker-env.git

Sau đó tiếp tục vào thư mục ‘ols-docker-env’ để cấu hình OpenLiteSpeed

$ cd ols-docker-env

Cấu hình file môi trường ‘.env’

$ nano .env

Chỉnh sửa múi giờ (timezone) về Asia/Ho_Chi_Minh và thay đổi mật khẩu của database MySQL

Sau đó nhấn Ctrl-O để lưu lại và Ctrl-X để thoát ra.

Thay đổi múi giờ của máy chủ để đồng bộ với Docker

$ sudo timedatectl set-timezone Asia/Ho_Chi_Minh

Vì mình muốn tăng cường bảo mật nên mình sẽ tạo ra một mạng ảo (virtual network) mới để sử dụng riêng cho OpenLiteSpeed và Cloudflare Tunnel, thay vì dùng network mặc định của Docker.

Tạo một bridged network mới bằng lệnh sau:

// thay thế <NETWORK_NAME> bằng tên network bạn muốn
$ docker network create <NETWORK_NAME>

// VD: tạo network có tên workleast
$ docker network create workleast

Lưu ý: trong suốt bài này mình sẽ sử dụng tên ‘workleast’ để làm ví dụ, bạn có thể thay đổi để phù hợp với trang của bạn.

Mặc định thì docker OpenLiteSpeed sẽ NAT các cổng (port) 80, 443, 7080… lên giao diện mạng WAN của máy chủ, cho phép truy cập trực tiếp trang web từ IP của máy chủ. Nhưng do mình sẽ truy cập trang web thông qua Cloudflare Tunnel nên mình sẽ cấu hình lại để container OpenLiteSpeed chỉ cho phép kết nối nội bộ chứ không cho truy cập từ bên ngoài.

Tiếp tục cầu hình file ‘docker-compose.yml’ của OpenLiteSpeed:

$ nano docker-compose.yaml
# tìm trong mục litespeed: và thay thế nội dung sau:
#ports:
      #- 80:80
      #- 443:443
      #- 443:443/udp
      #- 7080:7080
    expose:
      - "80"
      - "443"
      - "7080"

# tìm trong mục phpmyadmin: và thay thế nội dung sau:
   #ports:
      #- 8080:8080
      #- 8443:8443
    expose:
      - "8080"
      - "8443"

# tìm và thay thế
networks:
  #default: bridged
  default:
    name: workleast
    external: true

Sau khi thay đổi xong nó sẽ trông giống như sau:

Sau khi lưu lại cấu hình, mình tiến hành chạy OpenLiteSpeed Docker bằng lệnh sau:

$ docker compose up -d

Khi chạy lần đầu thì Docker sẽ tải về (pull) các file ảnh (image) của OpenLiteSpeed, MariaDB, phpMyAdmin… nên mình sẽ phải đợi một chút. Sau khi thành công sẽ thấy hiện như sau:

Mình tiếp tục thiết lập mật khẩu cho WebAdmin bằng lệnh:

// thay thế <my_password>
$ bash bin/webadmin.sh <my_password>

4. Cài đặt WordPress

Đầu tiên, thêm tên miền vào Docker bằng lệnh:

$ cd ~/ols-docker-env
$ bash bin/domain.sh -A workleast.com

Tạo database với tên miền:

$ bash bin/database.sh -D workleast.com

Cài đặt WordPress:

./bin/appinstall.sh -A wordpress -D workleast.com

Sau bước này thì trang WordPress của mình đã hoạt động, tuy nhiên do mình không mở port ở server nên chưa thể truy cập được mà phải kết nối thông qua Cloudflare Tunnel như mình đã đề cập ở trên.

5. Cài đặt Cloudflare Tunnel bằng Docker

Đầu tiên, truy cập vào trang Cloudflare One tại địa chỉ: https://one.dash.cloudflare.com/

Từ menu “Networks”, chọn “Tunnels” và tạo một Tunnel mới

Chọn “Cloudflare” rồi nhấn “Next” để tiếp tục

Đặt tên cho tunnel và nhấn “Save tunnel” để tiếp tục.

Chọn “Docker” rồi nhấn vào nút sao chép (copy) ở bên phải câu lệnh bên trên.

Lưu ý là mình sẽ không chạy trực tiếp câu lệnh này trên máy chủ Ubuntu mà sẽ sử dụng thêm một ứng dụng tên ‘Container Cloudflare Tunnel’ để chạy. Lý do là mình muốn cấu hình lại Cloudflare để tương thích với cấu hình của container OpenLiteSpeed mình đã làm ở trên.

Mình quay lại Ubuntu và thực hiện các lệnh sau để tải container ‘Container Cloudflare Tunnel’

$ cd ~
$ git clone https://github.com/jonas-merkle/container-cloudflare-tunnel.git

Tiếp tục thay đổi trạng thái các file cấu hình để không ‘lỡ tay’ tải ngược nó lên lại GitHub:

$ cd container-cloudflare-tunnel
$ git update-index --assume-unchanged .env
$ git update-index --assume-unchanged config/hosts

Sau đó mình tiến hành cấu hình file ‘.env’ bằng:

$ nano .env

Lúc này mình sẽ dán (paste) nội dung đã copy ở trang Cloudflare Tunnel vào giữa 2 dấu (”) của hằng giá trị CLOUDFLARE_TUNNE_TOKEN, nhưng chỉ lấy nội dung phía sau chữ ‘–token’ và xoá hết các nội dung phía trước. Sau khi làm xong nó sẽ có nội dung tương tự như sau:

CLOUDFLARE_TUNNEL_TOKEN='Jffo98fhfnfNmZjY4ZThhNGU4NTNmYmRiNmFhOTIiLCJ0IjoiYjhmYzU3OTktYzllNC00Y89djdjkflNGUyYzUyYzUxY2RjIiwicyI6Ik5EWmhPR0kxT1RVdE1HWmhNUzAwekxXRmlNelV0TWpKgjkdkd8dhmt3WW1SaiJ9'

Nội dung bên trên chỉ là nội dung token mình tự tạo ra để làm bài hướng dẫn này, vui lòng thay thế nội dung theo máy của bạn.

Lưu ý

Sau khi lưu lại, mình tiếp tục cấu hình file ‘docker-compose.yml’ của ‘Container Cloudflare Tunnel’:

$ nano docker-compose.yml

# tìm và thay thế nội dung sau 
    #network_mode: "host"
    networks:
      - default

# thêm vào cuối cùng
networks:
  default:
    name: workleast
    external: true

Sau khi thực hiện xong nó sẽ trông giống như vậy:

Sau khi lưu lại, mình tiến hành chạy docker ‘Container Cloudflare Tunnel’ bằng lệnh:

$ docker compose up -d

Sau đó mình quay lại trang cấu hình Cloudflare Tunnel và thấy thống báo đã kết nối thành công.

Tiếp tục nhấn ‘Next’ để cấu hình hostname cho tên miền

Phần này mình nhập tên miền vào mục ‘Domain’, chọn HTTP cho ‘Type’ và sử dụng ‘litespeed’ cho URL vì các dịch vụ trong Docker sẽ truy cập lẫn nhau bằng tên dịch vụ (service name) đã thiết lập trong file ‘docker-compose.yml’.

Sau bước này thì mình đã có thể truy cập vào trang WordPress bằng tên miền của mình tại địa chỉ ‘http://workleast.com’

6. Sử dụng giao thức HTTPS

Do mình muốn sử dụng giao thức HTTPS để tăng cường bảo mật khi kết nối với Cloudflare nên mình phải đăng ký chứng chỉ SSL cho tên miền với Let’s Encrypt bằng công cụ ACME được tích hợp sẳn trong docker OpenLiteSpeed.

Tiếp tục đăng ký chứng chỉ SSL cho tên miền bằng lệnh sau:

$ ./bin/acme.sh -D workleast.com

Sau khi đăng ký thành công thì mình quay lại trang ‘Public Hostname’ của Cloudflare Tunnel để chỉnh sửa lại cấu hình của tên miền

Cập nhật lại cấu hình như sau:

Mình sẽ đổi thành HTTPS ở mục ‘Type’ và nhập tên miền vào mục Origin Server Name của thiết lập TLS, sau đó nhấn nút ‘Save’ để lưu lại cấu hình.

7. Cấu hình cho tên miền phụ ‘www’

Từ trang cấu hình Public Hostname, nhấn vào nút ‘Add a public hostname’

Sau đó làm tương tự như bước 5 để thêm tên miền phụ ‘www’

8. Truy cập trang WebAdmin của OpenLiteSpeed

Để có thể truy cập vào trang WebAdmin của OpenLiteSpeed, mình cũng làm tương tự như bước 6, tạo thêm một public hostname nữa, ví dụ như ‘admin.workleast.com’

Vì WebAdmin của OpenLiteSpeed sử dụng cổng 7080 nên mình phải thêm vô trong phần URL là ‘litespeed:7080’ đồng thời phải bật tính năng ‘No TLS Verify’ do mặc định trang WebAdmin không dùng chung chứng chỉ SSL với tên miền.

Sau bước này mình đã có thể vào trang WebAdmin của OpenLiteSpeed bằng địa chỉ https://admin.workleast.com

9. Thay đổi cấu hình OpenLiteSpeed cho tên miền

OpenLiteSpeed khi cài đặt bằng docker có chút khác biệt so với cài đặt trực tiếp khi muốn cấu hình cho tên miền. Mặc định thi mình sẽ không thể cắu hình cho từng tên miền riêng lẻ được mà tất cả tên miền đều được sử dụng chung trong một template có tên là “docker”

Để có thể cấu hình cho từng tên miền riêng biệt, mình sẽ thực hiện như sau:

  • Đầu tiên, nhấn vào “docker”
  • Sau đó nhấn vào nút “Instantiate” ở tên miền mình muốn cấu hình
  • Tiếp tục chọn “Instantiate” khi được yêu cầu xác nhận.

Lúc này mục “Virtual Hosts” sẽ được xuất hiện tên miền mà mình muốn cấu hình giống như khi mình cài đặt OpenLiteSpeed trực tiếp.

Như vậy mình đã hoàn tất xây dựng trang WordPress sử dung OpenLiteSpeed Docker và Cloudflare Tunnel.

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

3 Bình luận

  1. Chào bạn,
    Cảm ơn bài viết chia sẻ của bạn. Bạn có thể viết thêm bài hướng dẫn cách chuyển host cho website được xây dựng bằng docker litespeed và cloudflare tunnel như bài viết trên không?

Để lại một bình luận

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 *