Hướng dẫn kỹ thuật

Hướng dẫn sử dụng Caddy trên Windows bằng CMD: Từ cài đặt đến Reverse Proxy và HTTPS

Caddy vừa có thể làm web server, vừa làm reverse proxy và đặc biệt có khả năng tự động thiết lập HTTPS với cấu hình tương đối đơn giản.

Đăng bởi Vuphuongnam · 10 phút đọc 21 lượt xem
Xem blog

 Vận hành Caddy trên Windows bằng CMD: Hướng dẫn thực hành từ cơ bản đến Reverse Proxy HTTPS

Bài viết này hướng dẫn cách vận hành Caddy trực tiếp bằng Command Prompt (CMD) trên Windows, phù hợp với người mới bắt đầu và có thể thực hành ngay.

1. Caddy là gì?

Caddy là một web server mã nguồn mở, có thể đảm nhiệm nhiều vai trò tương tự Nginx hoặc Apache.

Trong môi trường self-host, một trong những cách sử dụng Caddy phổ biến nhất là làm reverse proxy.

Ví dụ

Trên máy tính của bạn đang có ba ứng dụng:

plaintext
Ứng dụng QR Code    → localhost:3000
Ứng dụng Link Short → localhost:4000
Website             → localhost:8080

Thay vì phải mở từng port ra Internet, chúng ta đặt Caddy ở phía trước:

plaintext
INTERNET
    │
    │ Port 80/443
    ▼
Modem / Router
    │
    │ NAT Port 80/443
    ▼
WINDOWS PC
    │
    ▼
  CADDY
HTTPS :443
    │
┌──┼───────────┐
▼  ▼           ▼
:3000 :4000   :8080
QR Code  Link  Website

Người dùng bên ngoài chỉ cần truy cập:

plaintext
[https://qr.example.vn](https://qr.example.vn)
[https://link.example.vn](https://link.example.vn)
[https://www.example.vn](https://www.example.vn)

Caddy sẽ chuyển các yêu cầu đến đúng ứng dụng phía sau.

💡 Điều quan trọng: Các port 3000, 4000, 8080 không nhất thiết phải NAT ra Internet.

2. Chuẩn bị thư mục Caddy trên Windows

Để dễ quản lý, có thể tạo thư mục:

plaintext
C:\Caddy

Bên trong gồm:

plaintext
C:\Caddy

├── caddy.exe
└── Caddyfile

Trong đó:

  • caddy.exe: chương trình Caddy.
  • Caddyfile: file cấu hình của Caddy.

Có thể tải Caddy từ trang chính thức:

[Caddy Server](<a href="https://caddyserver.com/?utm_source=chatgpt.com">https://caddyserver.com/?utm_source=chatgpt.com</a>)

Sau khi tải về, đặt caddy.exe vào:

plaintext
C:\Caddy

3. Mở CMD để quản lý Caddy

Nên mở:

Command Prompt → Run as administrator

Sau đó chuyển đến thư mục Caddy:

plaintext
cd /d C:\Caddy

Kiểm tra:

plaintext
caddy version

Nếu Caddy hoạt động bình thường, hệ thống sẽ hiển thị phiên bản đang sử dụng.

Có thể xem danh sách lệnh bằng:

plaintext
caddy help

4. Tạo Caddyfile đầu tiên

Giả sử có một ứng dụng web đang chạy tại:

plaintext
[http://127.0.0.1:3000](http://127.0.0.1:3000)

và muốn người dùng truy cập bằng:

plaintext
[https://qr.example.vn](https://qr.example.vn)

Mở Caddyfile:

plaintext
notepad C:\Caddy\Caddyfile

Nhập:

plaintext
qr.example.vn {
    reverse_proxy 127.0.0.1:3000
}

Lưu file lại.

Ý nghĩa của cấu hình

plaintext
qr.example.vn
      │
      ▼
    Caddy
      │
      ▼
127.0.0.1:3000

Khi có người truy cập qr.example.vn, Caddy chuyển request đến ứng dụng đang chạy trên port 3000.

5. Kiểm tra Caddyfile trước khi chạy

Đây là bước rất nên thực hiện mỗi khi thay đổi cấu hình.

Chạy:

plaintext
caddy validate --config C:\Caddy\Caddyfile

Hoặc nếu CMD đang ở C:\Caddy:

plaintext
caddy validate --config Caddyfile

Nếu cấu hình đúng, Caddy sẽ thông báo cấu hình hợp lệ.

Nếu sai cú pháp, Caddy sẽ báo lỗi để chúng ta sửa trước khi áp dụng.

6. Format Caddyfile

Caddy có công cụ tự định dạng file cấu hình.

Chạy:

plaintext
caddy fmt --overwrite C:\Caddy\Caddyfile

Hoặc:

plaintext
caddy fmt --overwrite Caddyfile

Lệnh này giúp Caddyfile thống nhất cách trình bày và dễ đọc hơn.

7. Chạy Caddy

Cách đơn giản nhất:

plaintext
caddy run --config Caddyfile

Hoặc:

plaintext
caddy run --config C:\Caddy\Caddyfile

Caddy sẽ chạy trực tiếp trong cửa sổ CMD.

⚠️ Lưu ý: Nếu đóng cửa sổ CMD thì tiến trình này cũng sẽ dừng.

Muốn dừng Caddy, nhấn:

plaintext
Ctrl + C

Cách này rất phù hợp trong giai đoạn thử nghiệm và kiểm tra cấu hình vì chúng ta có thể quan sát log trực tiếp.

8. Chạy Caddy dưới nền

Caddy cũng hỗ trợ:

plaintext
caddy start --config Caddyfile

Sau khi chạy, CMD có thể tiếp tục sử dụng cho các công việc khác.

Muốn dừng:

plaintext
caddy stop

💡 Nếu sử dụng Caddy lâu dài trên Windows Server hoặc máy tính chạy 24/7, nên nghiên cứu cấu hình Caddy thành Windows Service thay vì phụ thuộc vào việc chạy thủ công.

9. Thay đổi cấu hình mà không cần tắt Caddy

Đây là một tính năng rất hữu ích.

Ví dụ Caddy đang chạy và chúng ta bổ sung thêm một ứng dụng:

plaintext
qr.example.vn {
    reverse_proxy 127.0.0.1:3000
}

link.example.vn {
    reverse_proxy 127.0.0.1:4000
}

Không cần stop rồi chạy lại toàn bộ Caddy.

Thực hiện:

plaintext
caddy validate --config Caddyfile

Nếu hợp lệ:

plaintext
caddy reload --config Caddyfile

Caddy sẽ áp dụng cấu hình mới.

10. Quy trình an toàn khi chỉnh sửa Caddyfile

Một thói quen rất hữu ích khi vận hành Caddy là:

plaintext
EDIT
  ↓
FORMAT
  ↓
VALIDATE
  ↓
RELOAD
  ↓
CHECK

Bước 1 - Sửa Caddyfile

plaintext
notepad C:\Caddy\Caddyfile

Bước 2 - Format

plaintext
caddy fmt --overwrite Caddyfile

Bước 3 - Kiểm tra

plaintext
caddy validate --config Caddyfile

Bước 4 - Áp dụng

plaintext
caddy reload --config Caddyfile

Đây là quy trình nên thực hiện mỗi khi thêm domain hoặc thay đổi reverse proxy.

11. Quản lý nhiều ứng dụng bằng Caddy

Giả sử máy Windows đang chạy:

plaintext
QR Code    → 127.0.0.1:3000
Link Short → 127.0.0.1:4000
Blog       → 127.0.0.1:8080

Caddyfile có thể viết:

plaintext
qr.example.vn {
    reverse_proxy 127.0.0.1:3000
}

link.example.vn {
    reverse_proxy 127.0.0.1:4000
}

blog.example.vn {
    reverse_proxy 127.0.0.1:8080
}

Kết quả

plaintext
qr.example.vn
      │
      └──────────→ 127.0.0.1:3000

link.example.vn
      │
      └──────────→ 127.0.0.1:4000

blog.example.vn
      │
      └──────────→ 127.0.0.1:8080

Đây là một trong những ưu điểm lớn của reverse proxy: một máy chủ có thể phục vụ rất nhiều ứng dụng bằng các subdomain khác nhau.

12. Caddy và HTTPS

Một trong những điểm hấp dẫn nhất của Caddy là khả năng tự động hóa HTTPS.

Với cấu hình:

plaintext
qr.example.vn {
    reverse_proxy 127.0.0.1:3000
}

khi các điều kiện DNS, mạng và firewall phù hợp, Caddy có thể tự động thực hiện nhiều công việc liên quan đến TLS/HTTPS thay vì người quản trị phải cấu hình chứng chỉ thủ công.

Mô hình

plaintext
Người dùng
    │
    │ HTTPS
    ▼
qr.example.vn
    │
    ▼
  Caddy
    │
    │ HTTP nội bộ
    ▼
127.0.0.1:3000

Ứng dụng phía sau thậm chí có thể chỉ cần chạy HTTP nội bộ, trong khi kết nối từ Internet đến Caddy được bảo vệ bằng HTTPS.

13. NAT port trên modem/router

Nếu máy Windows đặt trong mạng LAN và muốn cung cấp dịch vụ trực tiếp ra Internet qua Public IP, thông thường modem/router cần chuyển tiếp traffic đến máy chạy Caddy.

Ví dụ máy Caddy có IP LAN:

plaintext
192.168.1.100

Có thể cần cấu hình:

plaintext
WAN TCP 80
      ↓
192.168.1.100:80

WAN TCP 443
      ↓
192.168.1.100:443

Không cần NAT:

plaintext
3000
4000
8080

ra Internet nếu các ứng dụng chỉ được truy cập thông qua Caddy.

🔐 Điều này giúp kiến trúc gọn hơn và giảm việc công khai trực tiếp các dịch vụ backend.

14. Lưu ý về CGNAT

NAT port chỉ có tác dụng khi kết nối Internet của bạn cho phép thiết bị bên ngoài kết nối vào.

Nếu nhà mạng sử dụng CGNAT, việc NAT port trên modem có thể không đủ để server nhận kết nối trực tiếp từ Internet qua IPv4.

Có thể kiểm tra bằng cách so sánh:

plaintext
WAN IP trên modem/router
           │
           ▼
     Public IP Internet

Nếu WAN IPv4 thuộc các dải private hoặc CGNAT, hoặc khác với Public IPv4 mà Internet nhìn thấy, cần kiểm tra thêm cấu hình của nhà mạng.

Trong trường hợp này có thể cân nhắc:

  • Public IPv4 từ ISP
  • IPv6
  • VPN/tunnel
  • Reverse tunnel
  • Cloudflare Tunnel
  • VPS làm máy chủ trung gian

15. Kiểm tra Caddy có chiếm port 80 và 443 hay không

Trên CMD:

plaintext
| netstat -ano | findstr :80 |
| --- | --- |
| --- | --- |

Kiểm tra HTTPS:

plaintext
| netstat -ano | findstr :443 |
| --- | --- |
| --- | --- |

Nếu thấy:

plaintext
LISTENING

có nghĩa là đang có tiến trình lắng nghe trên port tương ứng.

Nếu Caddy báo không thể sử dụng port 80 hoặc 443, một trong những nguyên nhân thường gặp là port đã bị chương trình khác sử dụng.

Lấy PID ở cột cuối

Ví dụ:

plaintext
TCP    0.0.0.0:80    0.0.0.0:0    LISTENING    1234

Sau đó kiểm tra:

plaintext
| tasklist | findstr 1234 |
| --- | --- |
| --- | --- |

Windows sẽ cho biết tiến trình tương ứng.

16. Bộ lệnh Caddy nên ghi nhớ

Nếu mới sử dụng Caddy, không cần nhớ quá nhiều lệnh. Những lệnh dưới đây đã đủ cho phần lớn công việc vận hành thông thường.

Chuyển đến thư mục Caddy

plaintext
cd /d C:\Caddy

Kiểm tra phiên bản

plaintext
caddy version

Kiểm tra cấu hình

plaintext
caddy validate --config Caddyfile

Format Caddyfile

plaintext
caddy fmt --overwrite Caddyfile

Chạy Caddy

plaintext
caddy run --config Caddyfile

Chạy dưới nền

plaintext
caddy start --config Caddyfile

Reload cấu hình

plaintext
caddy reload --config Caddyfile

Dừng Caddy

plaintext
caddy stop

Kiểm tra port

plaintext
| netstat -ano | findstr :80 |
| --- | --- |
| --- | --- |
| netstat -ano | findstr :443 |

17. Ví dụ hoàn chỉnh

Giả sử chúng ta có một máy Windows với IP LAN:

plaintext
192.168.1.100

Ba ứng dụng đang chạy:

plaintext
QR Code    :3000
Link Short :4000
Website    :8080

DNS

plaintext
qr.example.vn
link.example.vn
[www.example.vn](http://www.example.vn)
        │
        ▼
    Public IP

Modem chuyển tiếp

plaintext
80  → 192.168.1.100:80
443192.168.1.100:443

Caddyfile

plaintext
qr.example.vn {
    reverse_proxy 127.0.0.1:3000
}

link.example.vn {
    reverse_proxy 127.0.0.1:4000
}

[www.example.vn](http://www.example.vn) {
    reverse_proxy 127.0.0.1:8080
}

Toàn bộ kiến trúc

plaintext
INTERNET
    │
    ▼
┌─────────────────┐
│   DNS DOMAIN    │
└────────┬────────┘
         │
         ▼
     PUBLIC IP
         │
         ▼
  MODEM / ROUTER
     NAT 80/443
         │
         ▼
┌──────────────────┐
│ WINDOWS + CADDY  │
192.168.1.100    │
└────────┬─────────┘
         │
    ┌────┼────────────┐
    │    │            │
    ▼    ▼            ▼
QR Code Link Short  Website
:3000   :4000        :8080

🔐 Các ứng dụng phía sau không cần trực tiếp tiếp xúc với Internet. Caddy trở thành cổng vào chung cho hệ thống.

Kết luận

Caddy đặc biệt phù hợp với người muốn xây dựng một hệ thống self-host đơn giản nhưng chuyên nghiệp trên Windows.

Thay vì phải NAT rất nhiều port:

plaintext
3000
4000
5000
8080
9000
...

chúng ta có thể tổ chức theo mô hình:

plaintext
Internet
    │
  80/443
    │
    ▼
  Caddy
    │
┌──┼──────────────┐
▼  ▼              ▼
app1.domain    app2.domain    app3.domain
    │              │              │
    ▼              ▼              ▼
  :3000          :4000          :8080

Cách tiếp cận này mang lại ba lợi ích rõ ràng:

  • Quản lý tập trung
  • Cấu hình domain thuận tiện
  • Đơn giản hóa HTTPS

Với người mới bắt đầu, chỉ cần nhớ quy trình:

Sửa Caddyfile → Format → Validate → Reload → Kiểm tra

là đã có thể vận hành phần lớn các cấu hình reverse proxy cơ bản của Caddy trên Windows.

⚠️ Lưu ý bảo mật

Không nên NAT trực tiếp các port của ứng dụng backend ra Internet nếu không thực sự cần thiết. Chỉ công khai những dịch vụ cần thiết, cấu hình Windows Firewall phù hợp và thường xuyên cập nhật Caddy cũng như các ứng dụng phía sau.

Đọc thêm

Bài viết liên quan