
Caddy là web server hiện đại tự động cấp SSL HTTPS, cấu hình đơn giản bằng một file duy nhất. So với Nginx và Apache, Caddy mang đến trải nghiệm developer-friendly vượt trội cho dự án mới. Đây là lựa chọn hàng đầu cho các lập trình viên muốn triển khai nhanh.

1. Caddy Là Gì?
Caddy (Caddy HTTP server) là web server mã nguồn mở viết bằng Go, được tạo bởi Matt Holt năm 2015. Điểm đặc biệt nhất: tự động cấu hình HTTPS thông qua Let’s Encrypt mà không cần bất kỳ thiết lập thủ công nào. Chỉ cần trỏ domain vào Caddy, HTTPS hoạt động ngay lập tức.
Tại sao chọn Caddy?
- Tự động HTTPS: không cần cấu hình SSL certificate
- Cú pháp cấu hình đơn giản hơn Nginx đáng kể
- REST API tích hợp sẵn để quản lý runtime
- Module hệ thống: không cần cài đặt thêm
- Hiệu suất cao: sử dụng Go goroutines
- Hỗ trợ HTTP/2, HTTP/3 mặc định
- Middleware tích hợp sẵn: gzip, logging, rate limit, cache, header
Nên dùng Caddy hay Nginx?
Dùng Caddy cho dự án mới, môi trường dev, microservices reverse proxy, và bất kỳ đâu cần HTTPS nhanh. Dùng Nginx khi cần hiệu suất cực cao với cấu hình phức tạp, hoặc khi đã có infrastructure Nginx sẵn. Cả hai đều xuất sắc cho mục đích web server.
2. Cài Đặt Caddy
Trên Linux (Debian/Ubuntu)
sudo apt install debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
Trên macOS
brew install caddy
Docker
docker run -d -p 80:80 -p 443:443 -v $PWD/Caddyfile:/etc/caddy/Caddyfile caddy:latest

Cài đặt Binary trực tiếp
curl -sL https://caddyserver.com/install.sh | sudo bash
Sau khi cài đặt, kiểm tra phiên bản: caddy version. Dịch vụ tự động khởi động cùng hệ thống.
3. Caddyfile: Cấu Hình Cơ Bản
Caddyfile là file cấu hình chính, đơn giản hơn rất nhiều so với Nginx. Ví dụ cơ bản để phục vụ static files:
:80 {
root * /var/www/html
browse
}
Reverse Proxy – trường hợp phổ biến nhất
myapp.local {
reverse_proxy localhost:3000
}
Chỉ 2 dòng cấu hình để tạo reverse proxy với HTTPS tự động. Không cần chỉ định server_name, listen port, hay SSL settings. Caddy tự động lấy và gia hạn Let’s Encrypt certificate mỗi 90 ngày.
Multiple Sites trên cùng một server
site1.com {
root * /var/www/site1
file_server
}
api.site1.com {
reverse_proxy localhost:8080
}
blog.site1.com {
reverse_proxy localhost:23456
}

4. Các Tính Năng Nâng Cao
Header Management
@cors {
header * Access-Control-Allow-Origin *
header * Access-Control-Allow-Methods "GET, POST, OPTIONS"
}
handle @cors {
reverse_proxy localhost:3000
}
Caddy có thể tự thêm security headers: HSTS, X-Content-Type-Options, X-Frame-Options chỉ bằng vài dòng cấu hình.
Rate Limiting
api.example.com {
rate_limit /api/* 10 1m
reverse_proxy localhost:3000
}
Cache tích hợp sẵn
blog.example.com {
cache {
ttl 1h
stale 7d
}
file_server
}
Request Logging
{
log {
output file /var/log/caddy/access.log
format json
}
}
5. So Sánh Caddy Với Nginx
| Tính năng | Caddy | Nginx |
|———–|——-|——-|
| Tự động SSL | Có (mặc định) | Cần cấu hình thủ công |
| File cấu hình | 1 file đơn giản | Cần blocks lồng nhau |
| Module | Tích hợp sẵn | Cài thêm module |
| REST API | Có | Không |
| Hiệu suất | Xuất sắc | Xuất sắc hơn chút |
| Community | Đang phát triển | Rất lớn, lâu đời |
| Tài liệu | Chính thức tốt | Rất phong phú |
6. Triển Khai Docker Compose Đầy Đủ
version: '3.8'
services:
caddy:
image: caddy:latest
container_name: caddy
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
restart: unless-stopped
app:
image: myapp:latest
container_name: app
expose:
- 3000
restart: unless-stopped
volumes:
caddy_data:
caddy_config:
Với Docker Compose, Caddy tự lấy certificate HTTPS khi domain trỏ đúng IP server. Volume caddy_data lưu trữ certificate để tái sử dụng sau khi restart.
7. Quản Lý Caddy Qua REST API
Caddy cung cấp API quản lý runtime tại localhost:2019 (có thể bảo mật bằng basic auth):
GET /config: Xem cấu hình hiện tại dưới dạng JSONPOST /config: Thay đổi cấu hình runtime mà không cần restartPOST /reload: Tải lại cấu hình từ CaddyfileGET /health: Kiểm tra trạng thái serverGET /metrics: Metrics Prometheus cho monitoring
Ví dụ sử dụng API
curl -s localhost:2019/config | python3 -m json.tool
curl -X POST localhost:2019/reload
curl -s localhost:2019/health
8. Mẹo Sử Dụng Thực Tế
- Dùng
Caddyfile.jsonnếu muốn cấu hình dạng JSON thay vì Caddyfile, phù hợp khi cấu hình phức tạp - Khi dùng reverse proxy, thêm
header Host {upstream_hostport}để chuyển đúng host đến upstream server - Test cấu hình trước khi deploy:
caddy validategiúp phát hiện lỗi cú pháp - Với môi trường production, kết hợp
caddy actuatedvới systemd để tự động quản lý - Đặt
orderstrong Caddyfile để kiểm soát thứ tự xử lý request khi nhiều handler trùng khớp - Sử dụng
handle_paththayhandlekhi muốn strip prefix path trước khi reverse proxy
9. Kết Luận
Caddy là lựa chọn lý tưởng cho developer cần web server nhanh, cấu hình ít, HTTPS tự động. Đối với dự án mới, reverse proxy cho microservices, hoặc dev environment, Caddy thay thế Nginx trong hầu hết trường hợp. Tài liệu chính thức tại caddyserver.com/docs. Tham gia cộng đồng tại GitHub Caddy để cập nhật tính năng mới.
