Skip to main content
BlogDevOps

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

Caddy memberi HTTPS otomatis dalam dua baris; Nginx plus certbot memberi kontrol dan ekosistem yang dalam. Begini cara saya memilih di antara keduanya per VPS.

Matthews Wong

Software Engineer

April 20269 menit baca
Caddy vs Nginx untuk HTTPS Otomatis: Kapan Masing-Masing Menang

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.

Bagaimana Caddy Membuat HTTPS Jadi Otomatis

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:

  • Penerbitan dan perpanjangan dikelola di dalam proses server itu sendiri. Tidak ada timer eksternal, tidak ada cron job, tidak ada binary kedua yang bisa diam-diam rusak sementara proxy-nya tetap jalan.
  • Failover issuer yang sepenuhnya redundan: kalau Let's Encrypt down atau me-rate-limit Anda, Caddy otomatis mencoba ZeroSSL sebelum backoff. Dengan certbot, outage CA di jendela renewal Anda adalah masalah yang harus Anda sadari sendiri.
  • Hostname lokal dan internal seperti localhost mendapat sertifikat self-signed dari CA bawaan Caddy, jadi lingkungan dev Anda juga berbicara HTTPS, dengan sintaks config yang sama.

Workflow Nginx + Certbot, Dikerjakan dengan Benar

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 certbot

Certbot 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.

Adu Langsung: Perbedaan yang Penting di Production

Benchmark kebanyakan mengukur skenario yang tidak akan pernah Anda temui di VPS 2 vCPU. Dimensi-dimensi inilah yang benar-benar menentukan keputusan saya:

AspekCaddyNginx + certbot
Usaha setup HTTPSNol 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 renewalDi dalam proses, kontinu, tanpa scheduler eksternal yang harus diaudit.systemd timer atau cron di luar server; harus dimonitor terpisah.
Failover CAFallback otomatis dari Let's Encrypt ke ZeroSSL, lalu retry dengan backoff.Satu CA saja kecuali Anda menulis script alternatifnya sendiri.
Ekosistem dan dokumentasiKomunitas 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 rendahDefault 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.

Kapan Saya Memilih Caddy

  • VPS kecil yang menampung beberapa aplikasi di belakang reverse proxy, di mana Caddyfile dua baris menggantikan lima puluh baris server block Nginx plus state certbot.
  • Tool internal dan environment staging, di mana sertifikat CA lokal otomatis berarti HTTPS di mana-mana tanpa ritual mkcert.
  • Proyek yang nantinya dirawat orang yang kurang berorientasi infrastruktur. Menyerahkan Caddyfile ke developer junior jauh lebih ramah daripada menyerahkan nginx.conf plus timer renewal yang harus dijaga tetap hidup.
  • Apa pun dengan banyak subdomain berumur pendek, karena penerbitan sertifikat on-demand menangani host yang belum Anda ketahui saat deploy.

Kapan Nginx Tetap Menang

  • Fleet yang sudah ada. Semua ingress Docker Swarm production saya dan role Ansible di sekitarnya mengasumsikan Nginx; biaya migrasi melebihi kenyamanan Caddy di sana.
  • Workload traffic tinggi di mana Anda ingin kontrol eksplisit atas ssl_session_cache, perilaku keepalive, worker process, dan ukuran buffer yang dijabarkan presisi oleh dokumentasi Nginx.
  • Setup yang butuh module atau pola spesifik dengan banyak preseden: scripting njs, rate limiting kompleks, mirroring traffic, atau semantik caching persis yang diandalkan aplikasi Anda yang tanpa CDN.
  • Tim yang sudah fasih Nginx. Bahasa config yang bisa dibaca semua orang mengalahkan bahasa config lebih bagus yang hanya dibaca satu orang.

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.

Migrasi Satu Server dari Nginx ke Caddy: Urutan yang Aman

Kalau Anda ingin mencoba Caddy di box yang sedang live tanpa membakar jembatan, ini urutan yang saya pakai:

  1. Tulis padanan Caddyfile dari server block Anda dan jalankan Caddy di port alternatif (8080/8443) berdampingan dengan Nginx untuk memvalidasi routing dan header.
  2. Turunkan TTL DNS Anda, lalu hentikan Nginx dan jalankan Caddy di 80/443 saat jendela sepi. Penerbitan pertama hanya hitungan detik per domain.
  3. Pantau log Caddy untuk aktivitas ACME dan akses setiap vhost. Biarkan sertifikat lama dan nginx.conf tetap utuh di disk sebagai jalur rollback.
  4. Setelah satu minggu bersih, hapus certbot, timer-nya, dan paket Nginx — timer renewal sisa yang menunjuk ke webroot mati senang sekali memenuhi log dengan noise.

Intinya

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.

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Mengapa Caddy menangani HTTPS secara otomatis sementara Nginx membutuhkan certbot?

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.

Apa yang terjadi jika Let's Encrypt mengalami outage saat Caddy perlu memperbarui sertifikat?

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.

Kapan saya tetap harus memilih Nginx daripada Caddy?

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.

Bagaimana cara memantau expiry sertifikat terlepas dari tool yang saya gunakan?

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.

Apa urutan paling aman untuk memigrasikan server live dari Nginx ke Caddy?

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.