Sau một thời gian dài gắn bó với Nginx và OpenLiteSpeed, gần đây mình đang dần chuyển qua sử dụng Caddy ứng dụng làm web server cho các website và reverse proxy cho các dịch vụ mạng trong homelab ở nhà.

So với Nginx và Openlitesped, Caddy cài đặt nhanh chóng dễ sử dụng hơn rất nhiều. Chỉ cần cấu hình 3 dòng lệnh tương tự như bên dưới là đã thiết lập xong 1 reverse proxy, đồng thời được thiết lập SSL tự động từ Let’s Encrypt.

webserver.thuanbui.me {
    reverse_proxy 192.168.0.50:9000
}Code language: YAML (yaml)

Bài viết hôm nay mình sẽ giới thiệu nhanh về Caddy Server cùng cách cài đặt và sử dụng.

1. Giới thiệu Caddy Server

Caddy Server là một phần mềm web server mã nguồn mở được phát triển dựa trên ngôn ngữ lập trình Golang (Go). Được ra đời từ 2015, Caddy liên tục được bổ sung nhiều tính năng mạnh mẽ, trong đó đáng chú ý nhất là việc hỗ trợ HTTP / 3.0 và tự động xác thực chứng chỉ Let’s Encrypt SSL.

Các tính năng của Caddy:

  • Tùy biến cấu hình dễ dàng với Caddyfile
  • Tùy biến cấu hình nâng cao với native JSON config
  • Tự động xác thực HTTPS
  • Đa tính năng: web server, reverse proxy, load balancer
  • Production-ready
  • Hỗ trợ HTTP/1.1, HTTP/2, and HTTP/3
  • Dễ dàng mở rộng tính năng nhờ thiết kế modular architecture
  • Hỗ trợ nhiều hệ điều hành, và không bị phụ thuộc dependencies
  • Và còn nhiều tính năng khác chờ bạn khám phá

2. Cài đặt Caddy bằng Docker

Bạn có thể cài đặt Caddy bằng nhiều cách thông qua hướng dẫn ở đây.

Mình chọn cách cài đặt bằng Docker để có thể dễ dàng xóa đi khi cần mà không ảnh hưởng đến hệ thống.

Tạo file compose.yml

mkdir ~/caddy
cd ~/caddy
nano compose.ymlCode language: Bash (bash)

Nhập vào nội dung sau

services:
  caddy:
    image: caddy:2.7.6-alpine
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./html:/var/www/html
      - ./caddy_data:/data
      - ./caddy_config:/configCode language: Markdown (markdown)

Tạo thêm file Caddyfile

nano CaddyfileCode language: Nginx (nginx)

và nhập tạm vào nội dung

:80 {
	respond "Hello, world!"
}Code language: JavaScript (javascript)

Kích hoạt Caddy

docker compose up -dCode language: Nginx (nginx)

Mở trình duyệt truy cập vào địa chỉ http://<IP>, nếu thấy hiện ra dòng chữ Hello, world! nghĩa là Caddy đã được cài đặt và kích hoạt thành công.

3. Cấu hình Caddy làm Reverse Proxy

Để cấu hình Caddy làm Reverse Proxy cho Portainer đang chạy ở địa chỉ 192.168.0.50:9000, mình chỉnh sửa file Caddyfile và bổ sung thêm 3 dòng sau

portainer.thuanbui.me {
	reverse_proxy 192.168.0.50:9000
}Code language: YAML (yaml)

Sau đó khởi động lại Caddy bằng lệnh

docker compose exec -w /etc/caddy caddy caddy reloadCode language: Bash (bash)

Chờ 1-2 phút để Caddy hoàn thành bước xác thực chứng chỉ SSL, giờ mình đã có thể truy cập Portainer thông qua địa chỉ https://portainer.thuanbui.me

Trong trường hợp Portainer và caddy nằm cùng trên 1 server, bạn có thể tham khảo bài viết dưới đây để biết cách thiết lập các container vào chung 1 docker network và chỉnh sửa lại Caddyfile như sau

portainer.thuanbui.me {
	reverse_proxy portainer
}

Mình cũng đã chuyển website thuanbui.me này qua chạy trên nền Docker và được Reverse Proxy thông qua Caddy. Khi check curl -I https://thuanbui.me sẽ hiện ra thông tin server: Caddy

HTTP/2 200
accept-ranges: bytes
alt-svc: h3=":443"; ma=2592000
content-type: text/html; charset=utf
etag: "sa2ao42enp"
last-modified: Sat, 09 Mar 2024 03:50:28 GMT
server: Caddy
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
content-length: 112309
date: Sat, 09 Mar 2024 03:58:40 GMTCode language: YAML (yaml)

Trong bài viết sau, mình sẽ hướng dẫn cách thiết lập website WordPress chạy trên nền Docker và Caddy.

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 vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâ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 *


23 Comments

  1. Biết đến trang này khi mày mò tự học làm web server.
    Đang muốn làm 1 host web bằng vps free của oracle nhưng còn khá mơ hồ, chưa tìm ra hướng dẫn cho newbie.
    Cảm ơn anh đã có những bài viết hướng dẫn, chúc anh khỏe ra thêm nhiều bài mới

  2. Thực sự bị kẹt ở lệnh nano khi trên Windows không hiểu lệnh này. Các bài viết của bạn đều không có một chỉ dẫn làm sao để Windows chạy được lệnh nano. Tôi buộc phải mò vào thư mục rồi tự tạo 1 file dummy “compose.yml”.

  3. Mong anh hướng dẫn cài caddy trên Nas Synology ạ. Em cài trên đó bằng mọi cách mà không được, hình như nó có cái gì đó lấy sẵn cổng 80 và 443 của NAS rồi (mặc dù đã xóa trắng NAS, chỉ cài DOCKER)
    Trên mạng cũng không có bài nào hướng dẫn cài, mong a chỉ giáo

    1. NAS Synology đã có tích hợp sẵn NGINX để làm Reverse Proxy nên cổng 80 và 443 đã bị sử dụng. Nếu muốn dùng Caddy thì bạn phải đổi thông tin phần port “80:80”, “443:443” và “443:443/udp” thành cổng khác chưa bị sử dụng. Ví dụ: “8880:80”, “4443:443”, “4443:443/udp”. Sau đó cấu hình Port Forward trên Router chuyển hướng port 80 vào port 8880 và port 443 vào port 4443 của Synology.

  4. Cảm ơn a đã phản hồi e đã làm được
    Cho e hỏi chút:
    1. Trong caddy có kiểu chỉ cấp trước chứng chỉ SSL mà chưa biết tên miền đó sẽ sử dụng cho services nào không. Như trong Nas synology thì mục Certificate có thể gõ trước vài tên miền mình chưa sử dụng vào để đó.
    2. Có cú pháp nào để add tên miền vào một folder con không anh:
    blog.domain.com >> 192.168.68.68:80/blog

      1. Cảm ơn a đã phản hồi!!!
        Em phát hiện ra là sử dụng caddy thì một số dịch vụ của Synology bị stop như dùng Quickconnect để đăng nhập vào app trên điện thoại.
        Em thử dùng Nginx Proxy Server thì bị lỗi INTERNAL ERROR khi xin cấp chứng chỉ SSL, em tìm khắp nơi trên reddit hay youtube mà chưa biết lỗi này ở đâu ra. Mong anh giải đáp

        1. Dịch vụ Synology bị lỗi vì bạn đã tắt một số ứng dụng của hệ thống để lấy port 80 và 443 cho Caddy. Muốn Synology hoạt động như bình thường thì phải giữ nguyên các port mặc định của nó, và cấu hình Caddy / Nginx Proxy Manager theo comment mình đã chia sẻ trước đó.

          1. Cấu hình Port Forward trên Router chuyển hướng port 80 vào port 8880 và port 443 vào port 4443 << anh có thể cho e xin cái tài liệu nào đó, tiếng Việt hay Anh đều được về vấn đề này với ạ.
            Trước giờ e chỉ biết mở cổng chứ chưa chuyển từ cổng này sang cổng khác bao giờ. Cám ơn a!!!
            P/S: Hôm trc e factory reset xong cài ngay Nginx Proxy Manager mà vẫn bị lỗi INTERNAL ERROR là cũng do lỗi cổng này ạ!!!
            Cám ơn anh

          2. Mở cổng chính là Port Forwarding đó bạn. Bình thường đa số mọi người sẽ làm là mở cổng 80 của Router (Port from) vào cổng 80 của Synology (Port to). Còn cái này sẽ làm là mở cổng 80 của Router vào cổng 8880 của Synology và 443 của Router vào cổng 4443 của Synology. Khi truy cập từ bên ngoài vào cổng 80 / 443 của Router thì nó sẽ được điều hướng vào cổng 8880 / 4443 tương ứng của Synology.

            https://www.howtogeek.com/66214/how-to-forward-ports-on-your-router/

            1
          3. Ôi!!! Ngại vãi chưởng =))!!! Hóa ra nó đơn giản thế thôi, em lại làm một cách rất chi là lằng ngoằng đó là đóng tất cả services của nginx xong đổi hẳn cổng của các DSM Nginx sang 81/444 xong mở lại các dịch vụ. Thế nên một vài cái như Quickconnect trên điện thoại không hoạt động được :))). Cám ơn a!! Một lời đơn giản những thật sự giải quyết được vấn đề

  5. Em chào anh! Nhờ chỉ dẫn của anh em đã cài caddy tốt trên synology rồi, tuy nhiên khi khai báo reverse proxy để vào nas bằng tên miền thì không được

    nas.domain.com {
    reverse_proxy 192.168.68.112:5000 (5001)
    }

    thì khi vào bằng tên miền không thấy phản hồi gì (chỉ trả về báo lỗi)

    1. Vậy thì em làm sai gì đó rồi. Và cần kiểm tra lại.
      Anh khai báo reverse proxy cho Caddy như bên dưới và truy cập bình thường.
      synology.thuanbui.me {
      reverse_proxy 192.168.196.10:5000
      }

      1. Cảm ơn anh!
        Không phải khai báo sai mà cái chứng chỉ nó bị xung đột, từ hôm qua tới hôm nay nó mới clear cho, ngay khi viết bài hỏi anh xong thì nó mới nhả chứng chỉ và truy cập được bình thường rồi!!!

        E thấy a đang dùng router mikrotik, a tư vấn qua cho e, e đang có tầm 2tr kinh phí để thay router, theo a nên dùng mikrotik rb760, hay một con openwrt tự make nào đó (dùng cho gia đình, khoảng trên dưới 30 thiết bị)

        1. Mình dùng Mirotik quốc dân 750gr3 ở nhà chạy NAS, Proxmox, LXC, máy ảo,… chắc cỡ 40-50 thiết bị, thấy chẳng thấm tháp gì với nó. Nên các con Mikrotik xịn hơn hay Router PC thì con nào cũng dư sức cho nhu cầu gia đình.

          1. Cảm ơn anh đã phản hồi!!
            Cho em hỏi thêm là muốn dùng caddy server hẳn như một host server có chỗ đặt web hoặc các thành phần của web cố định như /www/web của nginx thì làm như thế nào ạ, và em muốn toàn bộ các subdomain chưa đặt services về đâu thì đều trỏ vào web mặc định thì làm như thế nào ạ

            http://www.your-domain.com {
            root * /var/www/html
            file_server
            }