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

Foto oleh Taylor Vick

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