Bumalik sa blog
Agosto 19, 2026Mga Gabay

Paano I-install ang Caddy Web Server na may Automatic HTTPS

I-install ang Caddy sa Ubuntu mula sa official repository, magsulat ng Caddyfile para sa static sites at reverse proxies, unawain ang automatic certificates, systemd, logs, at mga karaniwang pagkakamali kapag nagmi-migrate mula sa Nginx.

Paano I-install ang Caddy Web Server na may Automatic HTTPS

Ang Caddy ay web server na kumukuha at nagre-renew ng TLS certificates bilang default. Para sa maliit na VPS na nagho-host ng isa o dalawang domains, inaalis nito ang buong klase ng Certbot timers at Nginx snippet files. Maikli ang configuration language (Caddyfile). Normal features ang reverse proxy, gzip, at HTTP/2, hindi weekend ng extra modules.

Tama pa rin ang Nginx para sa ilang shops: may battle-tested configs ka na, o kailangan mo ng napaka-specific na module. Para sa ibang karaniwang kaso ang gabay na ito — gusto mo ng HTTPS na gumagana sa sariwang Hiddence VPS nang hindi isaulo ang include snippets. I-i-install natin ang Caddy mula sa official apt repo, ipapaliwanag kung paano ito nakikipag-usap sa Let's Encrypt, magse-serve ng static site, magpu-proxy ng local app, magho-host ng ilang domains, titingnan ang logs, at aayusin ang karaniwang away sa port 80 sa Apache o lumang Nginx.

Kailan maganda ang Caddy

Automatic HTTPS ang headline, pero ang araw-araw na panalo ay mas kaunting moving parts. Nakikinig ang Caddy sa 80 at 443, nireridirect ang HTTP papunta sa HTTPS, at nag-iimbak ng certs sa data directory nito. Kailangan mo pa rin ng domain na tumuturo sa VPS. Kailangan mo pa ring hindi sirain ang ACME (firewall 80/tcp, walang ibang process na nagnanakaw ng :80). Kailangan ng wildcard certificates ng DNS provider module — mas mahaba iyon kaysa single-host cert.

  • Automatic HTTP→HTTPS at certificate renewal
  • Nababasa ang Caddyfile imbes na mahabang server blocks
  • Kayang reverse proxy para sa Node, Python, PHP-FPM sa extra config, o Docker backends
  • HTTP/2 at modernong TLS defaults nang walang cipher spreadsheet
  • systemd unit mula sa official package

Mga kailangan

Kailangang mag-resolve ang domain sa VPS na ito bago mapatunayan ng Caddy ang ACME HTTP-01. Kung nagpo-propagate pa ang DNS, mabibigo ang issuance ng Caddy at magre-retry; mukhang 'sira ang Caddy' kapag DNS lang pala. Itigil muna ang Apache o Nginx kung hawak nila ang 80/443.

  • Ubuntu 22.04 o 24.04
  • Domain A record papunta sa VPS IP (at AAAA kung gumagamit ka ng IPv6)
  • Libre at pinapayagan sa firewall ang ports 80 at 443
  • Root o sudo

Hakbang 1: I-install ang Caddy mula sa official repository

Huwag mag-install ng random na lumang Caddy mula sa default Ubuntu universe kung gusto mo ng kasalukuyang TLS at ACME behaviour. May dokumentadong apt source ang Caddy project. Pagkatapos mag-install, may caddy user at naka-enable ang service.

bash
ssh root@YOUR_VPS_IP
apt update && apt -y install debian-keyring debian-archive-keyring apt-transport-https curl gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list

apt update
apt -y install caddy

caddy version
systemctl status caddy --no-pager

Hakbang 2: Unang Caddyfile — static site

Ang default Caddyfile ay /etc/caddy/Caddyfile. Palitan ng domain mo. Susubukan ng Caddy kumuha ng certificate sa sandaling mag-load ang config kung hindi localhost ang hostname. Ilagay ang site files sa directory na nababasa ng caddy user (madalas www-data-style permissions, pero user caddy ang ginagamit ng package).

bash
mkdir -p /var/www/example
echo '<h1>It works</h1>' > /var/www/example/index.html
chown -R caddy:caddy /var/www/example

cat >/etc/caddy/Caddyfile <<'EOF'
example.com {
    root * /var/www/example
    file_server
    encode gzip
}
EOF

caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy

# Watch issuance:
journalctl -u caddy -f

Hakbang 3: Mag-reverse proxy ng local application

Kung nakikinig ang Gunicorn, Node, o Docker sa 127.0.0.1:8000, dapat Caddy lang ang public process. Ipinapasa ng reverse_proxy directive ang Host at X-Forwarded-* nang makatuwiran para sa karamihan ng apps. Kung gumagawa ang app ng absolute HTTP URLs, itakda ang trusted proxy / HTTPS flags sa app (Django SECURE_PROXY_SSL_HEADER, Express trust proxy, at iba pa).

bash
app.example.com {
    encode gzip
    reverse_proxy 127.0.0.1:8000
}

# Several hosts in one file are normal:
# blog.example.com {
#     root * /var/www/blog
#     file_server
# }

Hakbang 4: Firewall at systemd

Payagan ang 80 at 443. Ang unit ng Caddy ay caddy.service; sapat na ang reload pagkatapos mag-edit ng Caddyfile kung healthy ang process. Kung palitan mo ang environment variables para sa DNS plugin, mas malinaw ang full restart. Nakatira ang certificates sa ilalim ng /var/lib/caddy/.local/share/caddy/ bilang default — isama ang path na iyon sa backups kung mahalaga sa iyo ang rate limits sa reinstall.

bash
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

systemctl enable --now caddy
systemctl reload caddy

# Backup cert storage (path may vary slightly by version):
ls -la /var/lib/caddy/

Hakbang 5: Logs, compression, at headers

Tumutulong ang access logs kapag binabayo ng bot ang isang path o kapag nagde-debug ka ng 404s. Pwede kang mag-log bawat site. Magdagdag ng security headers kung nagho-host ka ng browser app; huwag kopyahin ang malaking header pack nang hindi nauunawaan ang HSTS (kapag nagtakda ka ng mahabang max-age, naaalala ito ng browsers).

bash
example.com {
    root * /var/www/example
    file_server
    encode gzip
    log {
        output file /var/log/caddy/example.log
    }
    header {
        X-Content-Type-Options nosniff
        Referrer-Policy no-referrer-when-downgrade
        -Server
    }
}

mkdir -p /var/log/caddy
chown caddy:caddy /var/log/caddy
systemctl reload caddy

Hakbang 6: PHP at iba pang extras

Kaya ng Caddy makipag-usap sa PHP-FPM sa php_fastcgi directive. Sapat iyon para sa maraming WordPress o Laravel hosts, pero kailangan mo pa rin ng naka-install na php-fpm at tumutugmang socket path. Kung may perpektong Nginx PHP config ka na, optional ang pag-migrate sa isang gabi — mas nagniningning ang Caddy sa reverse proxy + static + automatic TLS.

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

# Confirm FPM is running:
systemctl status php8.3-fpm

Pag-migrate mula sa Nginx nang walang downtime surprises

Itigil ang Nginx bago simulan ang Caddy o mag-aaway sila para sa 80/443. Ibaba ang DNS TTL isang araw bago kung lilipat ka rin ng IPs. Mag-test sa curl --resolve para matamaan mo ang bagong VPS bago palitan ang A record. Itago ang Nginx configs sa git ng isang linggo kung sakaling kailangan mong mag-roll back.

  • systemctl stop nginx && systemctl disable nginx
  • I-install ang Caddy, i-validate ang Caddyfile, simulan ang Caddy
  • curl -I --resolve example.com:443:NEW_IP https://example.com
  • Saka palitan ang DNS kung bago ang IP
  • Automatic ang re-issue; huwag ding magpatakbo ng Certbot laban sa parehong hostname

Troubleshooting

Halos palaging DNS, firewall, o ibang service sa port 80 ang ACME failures. Binabanggit ng Caddy log lines ang tls.obtain. Kung gumagana ang site sa HTTP pero hindi sa HTTPS, hindi natapos ang issuance. Kung masyadong maraming certificates, tinamaan mo ang Let's Encrypt rate limits — gamitin ang staging CA habang nagte-test, hindi production.

  • Nabigo ang validate: Caddyfile syntax, nawawalang brace
  • permission denied sa root: chown caddy para sa site directory
  • bind: address already in use — ss -tulpn | grep -E ':80|:443'
  • certificate timeout: dig +short ang domain mula sa VPS, ufw allow 80
  • 502 reverse_proxy: down ang backend, o mali ang pag-proxy mo sa localhost mula sa container network

Mga security notes

Conservative ang TLS defaults ng Caddy. Application security at SSH ang trabaho mo. Huwag i-enable ang Caddy admin API sa public interface. Local ang default admin endpoint; iwanan nang ganoon. Kung gumagamit ka ng Caddyfile mula sa internet, basahin ang bawat matcher — ang snippet na nagre-reverse_proxy ng /* papunta sa internal IP ay pwedeng maging open proxy.

  • Huwag i-expose ang admin API
  • Panatilihing updated ang package
  • HSTS lang pagkatapos kang sigurado na gumagana ang HTTPS para sa lahat ng hostnames
  • Ihiwalay ang test at production hostnames para protektahan ang ACME rate limits

Mga tips

  • Pinapanatiling nababasa ng caddy fmt --overwrite /etc/caddy/Caddyfile ang file
  • Gumamit ng import snippets kapag marami kang magkakaparehong sites
  • Para sa Docker, karaniwan ang caddy:alpine image na may mounted Caddyfile
  • Kailangan ng wildcard certs ng DNS module at API token — protektahan ang token na iyon
  • Basahin ang journalctl -u caddy bago mo isulat muli ang buong file

Ang Caddy sa VPS ay: official package, maikling Caddyfile, bukas na ports 80/443, DNS na tumuturo na sa server, at systemd reload pagkatapos mag-edit. Gamitin bilang static file server o reverse proxy sa harap ng Gunicorn, Node, o Docker. Gumagana ang automatic HTTPS kapag kayang sagutin ng ACME sa port 80; kung nabigo ang issuance, ayusin ang DNS at port conflicts bago sisihin ang Caddy. I-back up ang /var/lib/caddy kung madalas kang mag-reinstall.