- Caddy thắng tuyệt đối ở khoản dễ setup: 6 dòng Caddyfile là có HTTPS tự động, không cần certbot, không cần cron renew.
- Nginx mạnh ở tinh chỉnh hiệu năng, module rich, cộng đồng khổng lồ. Dev solo ít khi cần đến mức đó.
- Trên VPS 2GB RAM chạy 3-5 site cá nhân, Caddy đủ nhanh. Khi traffic vượt 500 req/s sustained, cân nhắc Nginx.
- Migrate Nginx sang Caddy mất 15 phút cho site đơn giản. Đi ngược lại khó hơn vì Caddy lưu cert tự động trong storage riêng.
- Kết luận thực dụng: dev solo, freelancer, vibe coder nên bắt đầu với Caddy. Khi nào thấy chật mới chuyển.
Mỗi lần dựng VPS mới, câu hỏi đầu tiên luôn là: dùng reverse proxy nào để serve app Node, FastAPI hay landing tĩnh? Hai cái tên xuất hiện nhiều nhất trong cộng đồng dev Việt Nam là Caddy và Nginx. Cả hai đều miễn phí, đều mã nguồn mở, đều chạy tốt trên VPS giá rẻ. Nhưng khi bạn là dev solo, chỉ có vài giờ rảnh mỗi tuần để dựng và bảo trì, thì cái nào nhanh hơn?
Bài viết so sánh chi tiết Caddy server vs Nginx trên các tiêu chí quan trọng nhất với dev solo: thời gian setup từ con số 0, cấu hình HTTPS, hiệu năng thực tế, ecosystem module, và tổng chi phí thời gian bảo trì hàng tháng. Tất cả benchmark và test trên Cloud VPS 50 (4GB RAM, AlmaLinux 9 và Ubuntu 24.04). Cuối bài có template Caddyfile và nginx.conf sẵn dùng cho 3 use case phổ biến: reverse proxy Node.js, serve static site, và đứng trước Docker container.
Caddy và Nginx khác nhau ở đâu về triết lý?
Nginx ra đời năm 2004 với mục tiêu giải bài toán C10k: cho phép một server xử lý 10 nghìn kết nối đồng thời. Triết lý thiết kế của Nginx là minh bạch, mỗi chỉ thị làm đúng một việc, và ưu tiên hiệu năng tối đa. Đổi lại bạn phải viết cấu hình tỉ mỉ. Một site HTTPS cơ bản với Nginx cần ít nhất 30-50 dòng nginx.conf cộng với một job certbot riêng để cấp và gia hạn cert Let's Encrypt.
Caddy ra đời năm 2015, viết bằng Go, đặt mục tiêu ngược lại: HTTPS phải mặc định, cấu hình phải gần với ngôn ngữ tự nhiên. Caddy là reverse proxy đầu tiên trên thế giới tự động xin và renew cert Let's Encrypt mà không cần bạn gõ một lệnh nào. Bạn chỉ cần khai báo domain trong Caddyfile, point DNS về VPS, Caddy lo phần còn lại.
Cả hai đều dùng kiến trúc event-driven, đều rất nhanh. Sự khác biệt nằm ở độ dốc học tập, lượng boilerplate cần viết, và mức độ tự động hóa các tác vụ vận hành thường ngày.
So sánh trực quan các tiêu chí quan trọng
| Tiêu chí | Caddy | Nginx |
|---|---|---|
| Thời gian setup site HTTPS đầu tiên | 5-10 phút | 30-45 phút |
| Dòng config trung bình cho 1 site | 3-6 dòng | 25-50 dòng |
| Tự động Let's Encrypt | Có, mặc định | Không, cần certbot |
| Tự động gia hạn cert | Có, không cần cron | Cần certbot cron hoặc systemd timer |
| HTTP/2 mặc định | Có | Có nhưng cần khai báo |
| HTTP/3 (QUIC) | Có, bật mặc định | Cần build với module quic |
| Reload không drop connection | Có | Có |
| RAM idle (1 site) | 15-25 MB | 5-10 MB |
| Throughput tối đa (1 core) | 30-40k req/s | 50-70k req/s |
| Module bên thứ ba | Hàng chục | Hàng trăm |
| Cộng đồng VN (2026) | Đang lên nhanh | Lớn, lâu đời |
Bảng trên cho thấy Caddy không thua Nginx ở các chỉ số quan trọng với dev solo. Khoản RAM cao hơn 10-15 MB không đáng kể trên VPS 2GB. Throughput thấp hơn một chút cũng không phải vấn đề khi site cá nhân thường chỉ phục vụ vài chục đến vài trăm req/s.
Setup Caddy từ 0 trên VPS Ubuntu trong 5 phút
Giả định bạn vừa thuê VPS mới, đã SSH vào với user root hoặc user sudo. Cài Caddy bằng package chính thức của Cloudsmith repository:
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
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 -y caddy
sudo systemctl status caddy
Sau khi cài xong, Caddy đã chạy với cấu hình mặc định tại cổng 80, serve một trang welcome. Mở /etc/caddy/Caddyfile và thay bằng nội dung sau cho site đầu tiên:
your-domain.com {
reverse_proxy localhost:3000
encode gzip zstd
log {
output file /var/log/caddy/your-domain.com.log
}
}
Lưu lại, chạy sudo systemctl reload caddy. Caddy sẽ tự động liên hệ Let's Encrypt, xin cert ECDSA, cài đặt, và bắt đầu serve site qua HTTPS. Lần đầu tiên có thể mất 30 giây. Sau đó truy cập https://your-domain.com là thấy app Node của bạn chạy. Không cần certbot, không cần cron, không cần nginx -t.
Setup Nginx tương đương: chuẩn bị tinh thần dài hơn
Để có site HTTPS tương đương với Nginx, bạn cần ít nhất 4 bước riêng biệt:
- Cài Nginx và certbot.
- Viết file cấu hình server block cho domain.
- Chạy certbot để xin cert và inject SSL config vào nginx.conf.
- Setup cron hoặc systemd timer để renew cert mỗi 60 ngày.
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
sudo mkdir -p /etc/nginx/sites-available
sudo nano /etc/nginx/sites-available/your-domain.com
Nội dung server block trước khi có SSL:
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
gzip on;
gzip_types text/plain text/css application/json application/javascript;
}
Sau đó symlink, test, reload, rồi mới chạy certbot:
sudo ln -s /etc/nginx/sites-available/your-domain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d your-domain.com --non-interactive --agree-tos -m [email protected]
Certbot sẽ tự sửa nginx.conf, thêm directive ssl_certificate, listen 443 ssl http2, và redirect HTTP sang HTTPS. Kết quả cuối cùng là một file dài 50-60 dòng. Renew thì certbot tự setup systemd timer khi cài qua apt, nên về sau bạn không cần đụng tới. Nhưng setup ban đầu rõ ràng phức tạp gấp 4-5 lần Caddy.
Cấu hình nhiều site cùng lúc: Caddyfile vs sites-available
Khi bạn host 5-10 site nhỏ trên cùng VPS, sự khác biệt càng rõ. Với Caddy, một file Caddyfile chứa tất cả:
blog.example.com {
root * /var/www/blog
file_server
encode gzip
}
api.example.com {
reverse_proxy localhost:4000
}
dash.example.com {
reverse_proxy localhost:5000
basicauth {
admin $YOUR_BCRYPT_HASH
}
}
webhook.example.com {
reverse_proxy 127.0.0.1:8080
@bot header User-Agent *bot*
respond @bot 403
}
16 dòng cho 4 site, đầy đủ HTTPS, basic auth, chặn bot, có file server tĩnh, có reverse proxy. Nginx tương đương cần ít nhất 4 file riêng, mỗi file 30-40 dòng, cộng thêm config snippets dùng chung. Bạn có thể tách Caddyfile ra import nếu thích, nhưng phần lớn dev solo vẫn giữ trong một file vì dễ nhìn.
Hiệu năng thực tế: benchmark trên Cloud VPS 50
Cài đặt test trên Cloud VPS 50 của TND (4GB RAM, 2 vCPU AMD EPYC, AlmaLinux 9). App backend là một Node.js Express trả JSON 2KB. Dùng wrk làm benchmark tool, chạy 30 giây với 100 connection đồng thời, 4 thread.
| Reverse proxy | Requests/sec | Latency p50 | Latency p99 | RAM khi load |
|---|---|---|---|---|
| Direct Node (no proxy) | 32,400 | 2.8ms | 9.2ms | 78 MB |
| Nginx 1.24 | 30,100 | 3.0ms | 10.1ms | 14 MB |
| Caddy 2.8 | 28,300 | 3.2ms | 11.4ms | 34 MB |
Khoảng cách giữa Nginx và Caddy chỉ khoảng 6 phần trăm throughput. Với site cá nhân hoặc app SaaS nhỏ, sự khác biệt này không quan sát được. Khi traffic của bạn chạm ngưỡng 10 nghìn req/s, có thể bắt đầu nghĩ tới Nginx. Đến lúc đó bạn cũng đã có experience đủ để chuyển đổi.
HTTP/3 và TLS 1.3: Caddy bật sẵn, Nginx phải tự build
Một điểm cộng lớn của Caddy 2.x là hỗ trợ HTTP/3 (QUIC) ngay từ binary mặc định. Bạn không cần làm gì, browser hiện đại tự dùng h3 khi truy cập. Nginx mặc định trong Ubuntu repo chỉ có HTTP/2. Muốn bật HTTP/3 phải compile lại Nginx từ source với module quic, hoặc dùng image OpenResty/Nginx Plus có phí.
Tương tự, Caddy mặc định bật TLS 1.3, OCSP stapling, và HSTS. Nginx cần khai báo từng dòng. Nếu mục tiêu của bạn là điểm A+ trên SSL Labs mà không tốn công, Caddy ra kết quả ngay sau khi cài.
Reverse proxy cho Docker container: cả hai đều dễ
Cả Caddy lẫn Nginx đều đứng tốt trước Docker compose. Với Caddy, bạn thậm chí có image caddy-docker-proxy tự đọc label từ container và sinh Caddyfile động:
services:
caddy:
image: lucaslorentz/caddy-docker-proxy:latest
ports:
- 80:80
- 443:443
networks:
- web
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- caddy_data:/data
restart: unless-stopped
myapp:
image: ghcr.io/me/myapp:latest
networks:
- web
labels:
caddy: app.your-domain.com
caddy.reverse_proxy: "{{upstreams 3000}}"
networks:
web:
external: true
volumes:
caddy_data:
Thêm container mới chỉ cần thêm label, không sửa Caddyfile. Nginx tương đương có nginx-proxy của jwilder kết hợp acme-companion, cũng làm được nhưng cần 2 container và setup nhiều biến môi trường hơn.
Module và ecosystem: Nginx vẫn áp đảo
Nếu workflow của bạn cần WAF (ModSecurity), Lua scripting (OpenResty), cache phức tạp (proxy_cache_path nhiều tier), GeoIP routing, rate limit kết hợp Redis, thì Nginx có hệ sinh thái rộng lớn hơn nhiều. Mọi tutorial DevOps trên internet 10 năm qua đều viết theo Nginx, nên copy-paste cũng nhanh hơn.
Caddy có module rate_limit, caddy-security cho OAuth/SAML, caddy-l4 cho TCP/UDP proxy, nhưng để dùng phải build Caddy với xcaddy. Quá trình build cũng nhanh, dưới 1 phút trên VPS 2GB:
curl -fsSL https://get.caddyserver.com/caddy/xcaddy | sh
./xcaddy build
--with github.com/mholt/caddy-ratelimit
--with github.com/greenpau/caddy-security
sudo mv caddy /usr/bin/caddy
sudo systemctl restart caddy
Vẫn dễ hơn compile Nginx với module --add-module truyền thống. Nhưng tổng số module Caddy còn ít hơn Nginx khoảng một bậc.
Bảo trì hàng tháng: ai tốn thời gian hơn?
Một dev solo trung bình tiêu khoảng 15-30 phút mỗi tháng cho việc vận hành reverse proxy: kiểm tra log, update version, debug khi cert hết hạn, thêm site mới. Với Caddy, công đoạn renew cert biến mất hoàn toàn. Việc thêm site mới chỉ là vài dòng vào Caddyfile rồi reload. Tổng thời gian dao động 5-10 phút/tháng.
Nginx tốn nhiều hơn vì certbot đôi khi fail (DNS chưa propagate, rate limit Let's Encrypt), bạn phải debug systemd timer, đọc /var/log/letsencrypt/letsencrypt.log. Thêm site mới là 4-5 bước, dễ quên một bước.
Trong 6 tháng vận hành 4 VPS chạy Caddy và 4 VPS chạy Nginx, tổng thời gian xử lý sự cố liên quan reverse proxy của nhóm dev TND chênh nhau khoảng 4 giờ. Caddy ít hơn. Phần lớn do certbot fail và quên reload sau khi sửa config.
Khi nào nên chọn Nginx thay vì Caddy?
- Khi đội của bạn đã có sẵn nhiều nginx.conf legacy mà migration không đáng công.
- Khi cần WAF nâng cao như ModSecurity với OWASP CRS đầy đủ rule set.
- Khi cần Lua scripting để viết logic phức tạp ngay trong proxy, dùng OpenResty.
- Khi traffic vượt 50k req/s sustained và mỗi 5 phần trăm hiệu năng đều quý.
- Khi đội DevOps quen Nginx và việc giữ nguyên stack giảm rủi ro hơn benefit của Caddy.
Khi nào Caddy là lựa chọn rõ ràng?
- Dev solo bắt đầu VPS đầu tiên: setup nhanh, ít chỗ sai, an tâm về HTTPS.
- Freelancer host nhiều landing cho client: mỗi client một dòng trong Caddyfile, không phải nhớ certbot per domain.
- Vibe coder chạy nhiều microservice nhỏ: caddy-docker-proxy tự cập nhật khi container lên xuống.
- Internal tool và staging environment: tự ký cert nội bộ với caddy CA, không cần Let's Encrypt.
- Edge proxy cho self-host AI: chuyển hướng request tới Ollama, Tabby, Open WebUI sau một domain HTTPS sạch sẽ.
Migrate từ Nginx sang Caddy: checklist 15 phút
- Backup nginx.conf và thư mục /etc/nginx/sites-enabled.
- Liệt kê tất cả server_name và upstream proxy_pass tương ứng.
- Cài Caddy nhưng tạm thời chạy ở cổng 8080 và 8443 để không xung đột.
- Viết Caddyfile mới với các domain đó, dùng tls internal để test cert tự ký trước.
- Stop Nginx, sửa Caddy về cổng 80/443, reload Caddy.
- Verify từng domain qua curl -I https://domain.
- Sau 24 giờ ổn định, uninstall Nginx và certbot.
Một lưu ý nhỏ: Caddy lưu cert tự xin tại /var/lib/caddy/.local/share/caddy/certificates. Nếu muốn quay lại Nginx, bạn có thể export cert từ thư mục đó hoặc xin lại từ Let's Encrypt qua certbot, chấp nhận downtime khi rate limit.
Template Caddyfile và nginx.conf cho 3 use case phổ biến
Template 1: Reverse proxy Next.js trên port 3000, có WebSocket cho hot reload trong dev:
app.your-domain.com {
reverse_proxy localhost:3000
encode gzip zstd
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options nosniff
Referrer-Policy strict-origin-when-cross-origin
}
}
Template 2: Serve static site từ folder build:
blog.your-domain.com {
root * /var/www/blog/dist
try_files {path} {path}/ /index.html
file_server
encode gzip
@assets path *.css *.js *.png *.svg *.woff2
header @assets Cache-Control "public, max-age=31536000, immutable"
}
Template 3: Proxy API có rate limit và CORS:
api.your-domain.com {
reverse_proxy localhost:4000
rate_limit {
zone api {
key {remote_host}
events 100
window 1m
}
}
header {
Access-Control-Allow-Origin "https://app.your-domain.com"
Access-Control-Allow-Methods "GET, POST, PUT, DELETE"
}
}
Để dùng rate_limit, cần build Caddy với plugin như mô tả ở phần module. Nếu không cần rate limit, bỏ block đó là chạy được ngay.
Kết luận: cái nào dễ setup hơn cho dev solo?
Caddy thắng tuyệt đối trên tiêu chí dễ setup. Trải nghiệm "viết 6 dòng config xong có HTTPS" gần như không có công cụ nào sánh được trong thế giới reverse proxy 2026. Nginx mạnh hơn về hiệu năng đỉnh, ecosystem rộng, nhưng đổi lại là 4-5x boilerplate config và quy trình cấp cert tách rời.
Lời khuyên thực dụng cho dev solo, freelancer và vibe coder Việt Nam: bắt đầu với Caddy. Khi nào project lớn lên đến mức Caddy không đủ, bạn cũng đã đủ kinh nghiệm để chuyển sang Nginx mà không bỡ ngỡ. Còn nếu mãi mãi chỉ host vài site nhỏ thì Caddy đủ tốt cho cả vòng đời.
FAQ
Caddy có thật sự tự gia hạn cert mà không cần làm gì không?
Có. Caddy chạy một goroutine nội bộ kiểm tra mỗi 12 giờ, và gia hạn khi cert còn 30 ngày. Không cần cron, không cần systemd timer. Chỉ cần process caddy chạy liên tục và port 80 mở để Let's Encrypt verify HTTP-01 challenge.
Nginx có nhanh hơn Caddy đến mức tôi cảm nhận được không?
Trên site cá nhân hoặc app SaaS nhỏ với traffic dưới 5 nghìn req/s, bạn không cảm nhận được. Khác biệt 6-10 phần trăm throughput chỉ xuất hiện rõ ở mức traffic rất cao và benchmark synthetic. Latency người dùng thật bị quyết định bởi backend và database, không phải reverse proxy.
Caddy chạy có ngốn RAM nhiều hơn nhiều so với Nginx không?
Caddy idle khoảng 20-30 MB so với Nginx 5-10 MB, do Caddy viết bằng Go có Go runtime. Trên VPS 2GB RAM, sự chênh lệch này không đáng kể. Trên VPS 512MB siêu rẻ, có thể cân nhắc Nginx cho tiết kiệm.
Tôi có thể chạy cả Caddy và Nginx trên cùng VPS không?
Có thể, nhưng chỉ một process bind được cổng 80 và 443. Setup phổ biến là Caddy ở front cổng 80/443 làm reverse proxy, Nginx ở phía sau bind 127.0.0.1:8080 phục vụ workload riêng (ví dụ PHP-FPM cho WordPress). Khi đó cert HTTPS chỉ Caddy quản, Nginx chạy plain HTTP nội bộ.
Caddy có support OAuth, SSO, basic auth không?
Basic auth là directive built-in. OAuth/SSO/SAML cần module caddy-security (build qua xcaddy). Sau khi build, bạn có thể bảo vệ subdomain bằng login Google/GitHub trong 10 dòng config. Nginx tương đương phải dùng oauth2-proxy của Bitly chạy tách biệt.
Sản phẩm Cloud VPS nào của TND chạy Caddy hoặc Nginx tốt nhất?
Cloud VPS 50 (4GB RAM, 2 vCPU, 60GB SSD CEPH) là sweet spot cho dev solo chạy 5-10 site nhỏ bằng Caddy hoặc Nginx. Giá từ 199k đến 3190k mỗi tháng tùy gói, có sẵn AlmaLinux 9 và Ubuntu 24.04 LTS để cài Caddy/Nginx trong vài phút.
VPS sẵn để cài Caddy hoặc Nginx trong 5 phút
Cloud VPS TND sẵn AlmaLinux 9, Ubuntu 22/24, Debian 12/13. SSD CEPH, snapshot 1-click, backup hằng ngày, network 200Mbps trong nước. IP riêng, root SSH, cài reverse proxy chỉ một lệnh apt là chạy được landing, API, dashboard.
Xem 8 cấu hình Cloud VPS →


