ติดตั้ง Caddy web server พร้อม HTTPS อัตโนมัติบน VPS

ติดตั้ง Caddy Web Server บน VPS (Auto HTTPS)

มิถุนายน 2026 · อ่าน 7 นาที

Caddy คือ web server ยุคใหม่ที่จุดเด่นคือ ขอและต่ออายุ SSL certificate จาก Let's Encrypt ให้อัตโนมัติ โดยไม่ต้องตั้ง certbot หรือ cron เอง เพียงชี้ domain มาที่ VPS แล้วเขียน config สั้นๆ ก็ได้ HTTPS ใช้งานทันที เหมาะมากสำหรับคนที่อยาก deploy เว็บหรือ reverse proxy เร็วๆ โดยไม่ต้องจัดการ cert ด้วยมือ บทความนี้สอนตั้งแต่ติดตั้งจนถึง reverse proxy และ config หลายเว็บ

ติดตั้ง Caddy

# Ubuntu / Debian (official repo)
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

# ตรวจว่าทำงาน
systemctl status caddy
caddy version

เสิร์ฟเว็บ Static พร้อม HTTPS อัตโนมัติ

แก้ไฟล์ /etc/caddy/Caddyfile ให้เหลือเท่านี้ — Caddy จะขอ cert ให้เองเมื่อ domain ชี้มาถูก:

example.com {
    root * /var/www/example
    file_server
    encode gzip zstd
}

# reload config
sudo systemctl reload caddy
หมายเหตุ: ก่อน reload ต้องให้ A record ของ example.com ชี้มาที่ IP ของ VPS และเปิด port 80 + 443 แล้ว เพราะ Caddy ต้องผ่าน HTTP/TLS challenge ของ Let's Encrypt ให้สำเร็จจึงจะออก cert ได้

Reverse Proxy ไปยังแอป (Node / PHP / Python)

กรณีรันแอปที่ port ภายใน เช่น Node ที่ 3000 หรือ PHP-FPM — Caddy ทำ reverse proxy พร้อม HTTPS ในไม่กี่บรรทัด:

app.example.com {
    reverse_proxy localhost:3000
}

api.example.com {
    reverse_proxy localhost:8000 {
        header_up X-Real-IP {remote_host}
    }
}

หลายเว็บในไฟล์เดียว และ Redirect

# www -> non-www
www.example.com {
    redir https://example.com{uri} permanent
}

example.com {
    root * /var/www/example
    file_server
    # บีบอัด + security header
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options nosniff
    }
}

blog.example.com {
    reverse_proxy localhost:2368   # Ghost
}

หลังตั้ง domain ใหม่ ควรตรวจว่า DNS, MX และ SSL chain ถูกต้องครบก่อนเปิดใช้จริง เครื่องมืออย่าง dnsxray.com ช่วยเช็กสุขภาพโดเมนและ SSL ได้ในที่เดียว และถ้าต้องการ VPS ในไทย/สิงคโปร์ที่ตั้ง Caddy ได้ทันที asiagb.com เป็นผู้ให้บริการที่รองรับ root access เต็มและซัพพอร์ตภาษาไทย


ตรวจสอบว่า Caddy ทำงานถูกต้อง

หลังตั้ง Caddyfile แล้ว ยืนยันว่า config valid, cert ออกจริง และเว็บตอบ HTTPS:

# 1. ตรวจ syntax ของ Caddyfile ก่อน reload
caddy validate --config /etc/caddy/Caddyfile

# 2. service ทำงานอยู่
systemctl status caddy

# 3. ทดสอบ HTTPS + ดู cert ที่ออกอัตโนมัติ
curl -I https://example.com
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -dates

# 4. ดู log การออก cert
journalctl -u caddy --since "10 min ago" | grep -i certificate
Tip: Caddy เก็บ cert ไว้ใน /var/lib/caddy/.local/share/caddy — backup โฟลเดอร์นี้ไว้จะกู้ rate-limit ของ Let's Encrypt ได้ถ้าต้องย้ายเครื่อง (Let's Encrypt จำกัด 50 cert/โดเมน/สัปดาห์)

แก้ปัญหาที่พบบ่อย

Error: ขอ cert ไม่สำเร็จ "challenge failed"

เกือบทุกครั้งคือ DNS ยังไม่ชี้มาที่ VPS หรือ firewall บล็อก port 80/443 ตรวจตามนี้:

dig +short example.com        # ต้องได้ IP ของ VPS
sudo ufw allow 80,443/tcp
sudo ss -tlnp | grep -E ':80|:443'

Error: "address already in use" port 80

มี Apache/Nginx ครอง port 80 อยู่ ต้องหยุดก่อนหรือเปลี่ยนให้ตัวใดตัวหนึ่งใช้ port:

sudo systemctl stop apache2 nginx
sudo systemctl disable apache2 nginx

reload แล้ว config ไม่อัปเดต

ตรวจว่าแก้ไฟล์ถูกตัว (/etc/caddy/Caddyfile) และ caddy validate ผ่าน ถ้า syntax ผิด Caddy จะคง config เดิมไว้และเขียน error ลง journal

ได้ cert แต่ขึ้น "rate limited"

ทดสอบบ่อยเกินจน Let's Encrypt บล็อกชั่วคราว ระหว่างทดสอบให้ใช้ staging endpoint ก่อน แล้วค่อยสลับเป็น production:

# ใน global block ของ Caddyfile
{
    acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

คำถามที่พบบ่อย

Caddy ดีกว่า Nginx ไหม?

ขึ้นกับงาน Caddy ชนะเรื่องความง่ายและ Auto HTTPS เหมาะกับ deploy เร็วและจำนวนเว็บไม่มาก ส่วน Nginx ยังเหนือกว่าด้านการ tune ขั้นสูง ปริมาณ traffic มหาศาล และ ecosystem ปลั๊กอินที่กว้างกว่า หลายคนใช้ Caddy หน้า dev/staging และ Nginx บน production ขนาดใหญ่

Caddy กิน RAM เยอะไหม?

ไม่เยอะ Caddy เขียนด้วย Go เป็น single binary idle ใช้ราว 20-40 MB เหมาะกับ VPS เล็กตั้งแต่ 1 GB RAM แต่ถ้าเปิด on-demand TLS หลายร้อยโดเมนควรเผื่อ RAM เพิ่ม

ต่ออายุ SSL อัตโนมัติจริงไหม ต้องตั้ง cron ไหม?

จริงและไม่ต้องตั้ง cron เลย Caddy เช็กและต่ออายุ cert ให้เองในเบื้องหลังก่อนหมดอายุ ~30 วัน ตราบใดที่ service รันอยู่และ domain ยังชี้มาถูก