Caddy vs Nginx untuk HTTPS Otomatis: Kapan Masing-Masing Menang

Foto oleh Taylor Vick
Caddy dirancang untuk melayani semua situs lewat HTTPS secara default sejak 2015 — penerbitan dan perpanjangan sertifikat dikelola di dalam proses server itu sendiri, cukup dipicu dengan mendeklarasikan hostname di Caddyfile. Nginx tidak mengimplementasikan ACME secara native, sehingga pendekatan standarnya mengharuskan instalasi certbot secara terpisah, yang menambahkan systemd timer atau cron job yang hidup di luar web server dan bisa gagal secara independen.
Caddy secara otomatis mencoba ZeroSSL sebagai fallback sebelum backoff, memberikan redundansi CA bawaan tanpa konfigurasi tambahan apa pun. Dengan certbot, outage CA di jendela renewal Anda adalah masalah yang harus Anda sadari dan tangani sendiri, karena certbot dikonfigurasi ke satu CA saja secara default.
Nginx tetap pilihan lebih baik untuk fleet yang sudah terstandardisasi dengannya lewat Ansible atau ingress Docker Swarm, karena biaya migrasi melebihi kenyamanan Caddy. Nginx juga menang saat Anda butuh tuning level rendah yang sangat detail — kontrol eksplisit atas ssl_session_cache, worker process, dan ukuran buffer — atau saat tim Anda sudah fasih Nginx, karena bahasa config yang bisa dibaca semua orang mengalahkan bahasa config lebih bagus yang hanya dibaca satu orang.
Post ini merekomendasikan mengekspor metrik expiry sertifikat ke Prometheus dan menyetel alarm di sisa 21 hari. Ambang ini terbukti berguna dalam praktiknya: pernah menangkap timer certbot yang rusak sekaligus instance Caddy yang volume storage-nya penuh sehingga tidak bisa menyimpan sertifikat hasil renewal.
Jalankan Caddy di port alternatif (8080/8443) berdampingan dengan Nginx terlebih dahulu untuk memvalidasi routing dan header, lalu turunkan TTL DNS sebelum memindahkan Caddy ke port 80/443 saat jendela sepi. Biarkan sertifikat lama dan nginx.conf tetap utuh di disk sebagai jalur rollback, dan hapus certbot, timer-nya, serta paket Nginx hanya setelah satu minggu operasi yang bersih.

Foto oleh Taylor Vick
Setiap VPS yang saya siapkan akhirnya sampai pada pertanyaan yang sama: siapa yang menangani terminasi TLS? Hampir sepanjang karier saya jawaban refleksnya adalah Nginx, dengan certbot ditempel untuk Let's Encrypt. Lalu saya mulai memakai Caddy di side project dan tool internal, dan kesimpulan jujurnya: tidak ada yang menang secara universal. Keduanya menang di situasi berbeda, dan tahu Anda sedang berada di situasi yang mana akan menyelamatkan Anda dari mengasuh renewal berbasis cron atau berkelahi dengan bahasa config asing jam 2 pagi.
Versi singkatnya: Caddy membuat HTTPS jadi non-event — sertifikat diterbitkan, diperpanjang, dan di-failover otomatis begitu Anda mendeklarasikan hostname. Nginx tetap pilihan lebih baik saat Anda butuh ekosistemnya yang sangat besar, knob tuning yang teruji, atau Anda sudah menjalankan fleet yang terstandardisasi dengannya lewat Ansible. Di bawah ini perbandingan detail yang saya harap saya punya sebelum memigrasikan server pertama saya.
Caddy melayani semua situs lewat HTTPS secara default sejak 2015. Anda menulis Caddyfile yang mendeklarasikan hostname, dan deklarasi itu sendirilah pemicunya: Caddy mengambil sertifikat dari provider ACME, me-redirect HTTP ke HTTPS, dan menjaga semuanya tetap diperpanjang tanpa satu baris ekstra pun. Ini benar-benar seluruh config untuk dua aplikasi yang di-proxy:
# Caddyfile — this is the entire HTTPS configuration
app.example.com {
reverse_proxy localhost:3000
}
api.example.com {
reverse_proxy localhost:4000
}Yang Anda dapatkan secara implisit dari file itu adalah bagian yang paling mengesankan bagi saya:
Nginx tidak melakukan ACME sendiri; pasangan standarnya adalah certbot, di-install via snap sesuai instruksi terkini dari EFF. Setup-nya singkat tapi ia adalah komponen bergerak terpisah dengan siklus hidupnya sendiri:
# Nginx + certbot: install once, then per domain
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
sudo certbot --nginx -d app.example.com
# verify the renewal timer actually works
sudo certbot renew --dry-run
systemctl list-timers | grep certbotCertbot memasang systemd timer (atau cron job) yang memperpanjang sertifikat sebelum kedaluwarsa dan me-reload Nginx. Ini bekerja baik — saya menjalankannya bertahun-tahun di VPS klien — tapi perhatikan kata kerjanya: memasang, memperpanjang, me-reload. Tiga hal yang hidup di luar web server Anda dan bisa gagal secara independen. Pemeriksaan dry-run di atas tempatnya di playbook provisioning Anda, bukan di ingatan Anda.
Benchmark kebanyakan mengukur skenario yang tidak akan pernah Anda temui di VPS 2 vCPU. Dimensi-dimensi inilah yang benar-benar menentukan keputusan saya:
| Aspek | Caddy | Nginx + certbot |
|---|---|---|
| Usaha setup HTTPS | Nol di luar menamai host. Redirect, penerbitan, dan renewal adalah default. | Install certbot, jalankan per domain, verifikasi timer-nya. Bisa di-script tapi tetap kerja nyata. |
| Model renewal | Di dalam proses, kontinu, tanpa scheduler eksternal yang harus diaudit. | systemd timer atau cron di luar server; harus dimonitor terpisah. |
| Failover CA | Fallback otomatis dari Let's Encrypt ke ZeroSSL, lalu retry dengan backoff. | Satu CA saja kecuali Anda menulis script alternatifnya sendiri. |
| Ekosistem dan dokumentasi | Komunitas lebih kecil; lebih sedikit jawaban siap salin untuk setup eksotis. | Dua puluh tahun module, tutorial, dan jawaban Stack Overflow untuk hampir semua hal. |
| Tuning level rendah | Default yang masuk akal; tuning dalam terjadi di config JSON dan dokumentasinya lebih tipis. | Kontrol sangat detail: ssl_session_cache, tuning worker, ukuran buffer, module rate limiting. |
Kedua stack kini sama-sama berakhir di default TLS modern: Nginx mengirim TLSv1.2 dan TLSv1.3 sebagai default sejak 1.27.3, dan Caddy menegosiasikan protokol modern langsung dari awal. Perbedaan keamanan sesungguhnya bersifat operasional: sertifikat kedaluwarsa adalah insiden keamanan yang dilihat user Anda, dan desain Caddy membuat kelas insiden itu jauh lebih sulit terjadi secara struktural.
Apa pun pilihan Anda, jangan biarkan kedaluwarsa TLS hanya terlihat oleh user Anda. Saya mengekspor expiry sertifikat ke Prometheus dan beralarm di sisa 21 hari — ambang itu pernah menangkap timer certbot yang rusak sekaligus instance Caddy yang volume storage-nya penuh sehingga tidak bisa menyimpan sertifikat hasil renewal.
Kalau Anda ingin mencoba Caddy di box yang sedang live tanpa membakar jembatan, ini urutan yang saya pakai:
HTTPS otomatis bukan lagi pembeda yang harus Anda bayar dengan kompleksitas. Caddy menjadikannya default, dan untuk workload VPS kecil-menengah yang sebagian besar dari kita jalankan, default itu bernilai uang operasional nyata: lebih sedikit komponen bergerak, lebih sedikit insiden expiry, lebih sedikit playbook.
Tapi keputusan infrastruktur menyangkut fleet dan tim, bukan server tunggal. Nginx dengan timer certbot yang terverifikasi dengan benar tetap stack yang sepenuhnya modern, dan jadi pilihan tepat saat kedalaman ekosistem, kontrol tuning, atau otomasi yang sudah ada memberatkan timbangan. Pilih per situasi — dan apa pun pilihan Anda, taruh expiry sertifikat di dashboard yang benar-benar Anda lihat.
Sumber dan bacaan lanjutan