Cài Caddy Server Trên VPS 2026 — Web Server Tự Động HTTPS Cứu Tôi Khỏi Hàng Giờ Cấu Hình SSL

📅 24/06/2026 · ⏱ 14 phút đọc · 🏷 Web Server · DevOps · SSL

1. Tôi Đã Bỏ Nginx Sau 7 Năm Vì Một Lý Do

Hồi tháng 3 năm nay, tôi phải setup một con VPS nhỏ cho khách hàng — một trang landing page WordPress đơn giản, cần HTTPS. Tôi mở Nginx config lên, bắt đầu viết server { listen 443 ssl http2; ssl_certificate /etc/letsencrypt/live/... — và nhận ra mình đã làm cái việc này cả trăm lần trong 7 năm qua. Certbot cron, renew tự động nhưng thỉnh thoảng vẫn fail vì port 80 bị chiếm, rồi phải vào sửa tay.

Một thằng bạn DevOps bảo tôi: "Thử Caddy đi, một dòng là xong HTTPS." Tôi cười trừ — nghe như quảng cáo hosting vậy. Nhưng rồi tôi thử. Và đúng là một dòng là xong HTTPS thật.

Bài này không phải để thuyết phục bạn bỏ Nginx. Nginx vẫn là web server số một thế giới với 32.8% market share (W3Techs, tháng 4/2026). Nhưng với phần lớn dự án cá nhân và vừa-nhỏ, Caddy giúp bạn tiết kiệm hàng giờ cấu hình SSL — và đó là lý do nó xứng đáng có mặt trên VPS của bạn.

2. Caddy Là Gì? Nó Khác Nginx & Apache Như Thế Nào?

Caddy là web server mã nguồn mở viết bằng Go, ra đời năm 2015 bởi Matt Holt. Khác với Nginx (viết bằng C, ra đời 2004 để giải bài toán C10K) và Apache (tiền sử từ 1995), Caddy được thiết kế từ đầu với triết lý: mọi thứ mặc định phải an toàn, và không cần cấu hình để đạt được điều đó.

Tiêu chíCaddy 2.11Nginx 1.30Apache 2.4
Ngôn ngữGoCC
RAM idle (tối thiểu)~15-25MB~2-3MB~8-12MB
Binary size~45MB (static)~1MB~2MB
HTTPS tự độngCó sẵn, zero-configKhông (cần certbot/acme.sh)Không (cần certbot)
HTTP/3 (QUIC)Có sẵn, production-gradeCó (từ 1.25)Plugin bên thứ ba
Hot reload configCó, qua APICó, qua SIGHUPCó, qua graceful restart
Config syntaxCaddyfile (đơn giản)nginx.conf (DSL).htaccess + httpd.conf
LicenseApache 2.0BSD 2-ClauseApache 2.0
GitHub Stars (6/2026)69,500+27,400+~7,000

Con số đáng chú ý: benchmark tháng 4/2026 từ dev.to cho thấy Caddy 2.8 phục vụ 142.000 req/s với file tĩnh 1KB, nhanh hơn Nginx 1.26 khoảng 22% trên cùng phần cứng 16-core ARM. Nhưng Nginx vẫn thắng ở large-file streaming và tiêu thụ RAM thấp hơn ở idle.

🎯 Quy tắc chọn: Caddy = dự án cá nhân, startup, developer cá nhân, cần HTTPS tự động. Nginx = production lớn, CDN edge, cần kiểm soát chi tiết từng tham số, hoặc tổ chức đã có hệ sinh thái Nginx sẵn.

3. Cài Caddy Trên Ubuntu 24.04

Caddy có repo chính thức, cài đơn giản hơn Nginx:

sudo apt update
sudo apt install -y 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 -y caddy

Kiểm tra:

caddy version
# v2.11.2 h1:...

Caddy tự động cài systemd service và chạy ngay. Mặc định nó serve một trang "Caddy is configured" trên port 80.

sudo systemctl status caddy --no-pager

Caddy config mặc định nằm ở /etc/caddy/Caddyfile. Đây là file duy nhất bạn cần — không có sites-available, sites-enabled, conf.d như Nginx.

4. Caddyfile: Cấu Hình Một Dòng HTTPS — Có Thật Không?

Mở Caddyfile mặc định:

sudo nano /etc/caddy/Caddyfile

Thay bằng:

yourdomain.com {
    root * /var/www/html
    file_server
}

Reload:

sudo systemctl reload caddy

Vậy thôi. Caddy sẽ:

  1. Phát hiện tên miền trỏ về server
  2. Tự động liên hệ Let's Encrypt để xin chứng chỉ SSL
  3. Cấu hình HTTPS với HTTP/2 và HTTP/3
  4. Tự động redirect HTTP → HTTPS
  5. Tự động renew chứng chỉ trước khi hết hạn

Bạn không cần cài certbot, không cần chạy cron, không cần chỉnh ssl_certificate. Caddy làm tất cả.

⚠️ Điều kiện: Domain phải trỏ DNS đúng về IP VPS trước khi Caddy chạy. Nếu DNS chưa trỏ, Caddy sẽ thử xin cert và fail — khi đó phải reload lại sau khi DNS propagate.

5. Caddy Làm Reverse Proxy — Dễ Hơn Nginx Rất Nhiều

Đây là use case phổ biến nhất: Caddy làm reverse proxy cho ứng dụng chạy trên localhost (Node.js, Python, PHP-FPM, Docker...).

Proxy tới Node.js app (port 3000):

api.yourdomain.com {
    reverse_proxy localhost:3000
}

Proxy tới nhiều backend với load balancing:

app.yourdomain.com {
    reverse_proxy localhost:3000 localhost:3001 localhost:3002 {
        lb_policy least_conn
    }
}

So với Nginx — để làm cùng việc trên bạn cần viết:

# Nginx equivalent (để so sánh):
server {
    listen 443 ssl http2;
    server_name api.yourdomain.com;
    ssl_certificate /etc/letsencrypt/live/api.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/api.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        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;
    }
}

Caddy tự động set các header proxy chuẩn (X-Forwarded-For, Host, v.v.) — không cần khai báo thủ công.

6. Chạy PHP Với Caddy + PHP-FPM

Nếu bạn chạy WordPress hoặc bất kỳ ứng dụng PHP nào, Caddy hỗ trợ PHP-FPM trực tiếp:

yourdomain.com {
    root * /var/www/wordpress
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
}

Cài PHP-FPM trước:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip

Tất cả file PHP trong /var/www/wordpress sẽ được xử lý qua PHP-FPM. File tĩnh (CSS, JS, ảnh) được serve trực tiếp bởi Caddy — hiệu quả hơn Nginx+PHP-FPM vì không cần proxy_pass.

💡 WordPress rewrite rules: Caddy không cần try_files như Nginx. Với WordPress, thêm directive route để xử lý permalink:
route {
    root * /var/www/wordpress
    php_fastcgi unix//run/php/php8.3-fpm.sock
    file_server
    try_files {path} /index.php?{query}
}

7. Các Tính Năng Nâng Cao Trong Caddyfile

Rate Limiting

yourdomain.com {
    rate_limit {
        zone dynamic {
            key {remote_host}
            events 100
            window 1m
        }
    }
    reverse_proxy localhost:3000
}

Basic Auth

admin.yourdomain.com {
    basicauth {
        admin $2a$14$hashedpasswordhere
    }
    reverse_proxy localhost:9000
}

Tạo hash password:

caddy hash-password

Custom Header / CORS

api.yourdomain.com {
    header {
        Access-Control-Allow-Origin *
        Access-Control-Allow-Methods "GET, POST, OPTIONS"
        X-Content-Type-Options nosniff
    }
    reverse_proxy localhost:3000
}

Redirect / Rewrite

old.yourdomain.com {
    redir https://new.yourdomain.com{uri} permanent
}

8. Caddy Với Docker — Combo Hoàn Hảo

Caddy có Docker image chính thức và đặc biệt mạnh khi dùng làm reverse proxy cho container:

# docker-compose.yml
services:
  caddy:
    image: caddy:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config

  app:
    image: my-node-app
    # Không cần expose port ra ngoài
    # Caddy tự nối vào internal network

volumes:
  caddy_data:
  caddy_config:

Caddyfile:

app.yourdomain.com {
    reverse_proxy app:3000
}

Điểm mạnh của Caddy trong Docker: container labels — bạn có thể cấu hình route ngay trong docker-compose mà không cần sửa Caddyfile. Nhưng để đơn giản, dùng Caddyfile là đủ cho hầu hết trường hợp.

9. Benchmark Nhanh: Khi Nào Caddy Nhanh Hơn Nginx, Khi Nào Không

Từ benchmark tháng 4/2026 (tech-insider.org, dev.to) trên máy 16-core ARM:

Test caseCaddy 2.11Nginx 1.30Người thắng
Static file 1KB~142,000 req/s~117,000 req/sCaddy (+22%)
Static file 100KB~38,000 req/s~36,000 req/sNgang nhau (~5%)
Large file streaming (1GB+)BaselineNhanh hơn 17%, ít RAM hơn 38%Nginx
Reverse proxy (keep-alive)~31,000 req/s~29,000 req/sCaddy (+7%)
TLS handshake (new connection)Nhanh hơnChậm hơnCaddy
RAM khi idle~15-25MB~2-3MBNginx
RAM khi 50K connections~450MB~280MBNginx

Kết luận thực tế: Với 99% dự án cá nhân và doanh nghiệp nhỏ chạy trên VPS, sự khác biệt hiệu năng là không đáng kể. Cái bạn tiết kiệm được là thời gian cấu hình và maintain SSL. Chọn Nginx khi bạn cần phục vụ file lớn (video streaming, download server) hoặc cần tối ưu RAM đến từng MB.

10. Tổng Kết: Có Nên Chuyển Từ Nginx Sang Caddy?

Nên chuyển nếu:

Giữ Nginx nếu:

🚀 Muốn tự cài Caddy nhưng chưa có VPS?

Thuê VPS giá rẻ từ 40K/tháng, IP riêng, cài đặt tự do mọi web server.

Thuê VPS Ngay