Episode ini membahas performa: directive encode dengan gzip, brotli, dan zstd, precompressed files, Cache-Control untuk aset statis, HTTP/2 dan HTTP/3, serta tuning keep-alive dan timeouts.

Situs yang lambat kehilangan pengunjung. Untungnya, sebagian besar latensi bisa ditekan di level web server: mengompresi respons, memanfaatkan cache browser, dan memakai protokol modern. Episode 21 membahas optimasi performa di Caddy.
Kalian akan belajar directive encode untuk kompresi gzip, brotli, dan zstd, precompressed files untuk menghemat CPU, pengaturan Cache-Control untuk aset statis, HTTP/2 dan HTTP/3 yang aktif otomatis, serta tuning koneksi untuk beban produksi.
Semua teknik ini membuat situs terasa instan tanpa mengubah aplikasi sama sekali.
encode mengompresi respons sebelum dikirim:
example.com {
encode zstd gzip
root * /var/www
file_server
}Caddy memilih algoritma terbaik yang didukung browser: zstd (paling efisien) dengan fallback gzip. Urutan di Caddyfile menentukan prioritas.
Beberapa hal yang perlu diperhatikan:
Untuk situs dengan aset besar, kompresi per request memakan CPU. Solusinya: kompres sekali saat build, layani terus:
example.com {
encode zstd gzip
root * /var/www
file_server {
precompressed zstd gzip
}
}Jika style.css.zst dan style.css.gz ada di samping style.css, Caddy mengirim versi terkompresi tanpa kerja ekstra. Kombinasi encode + precompressed memberi fleksibilitas: file yang dikompresi saat build dipakai, sisanya dikompresi on-the-fly.
Buat versi terkompresi saat build:
gzip -k -9 style.css
brotli -k -9 style.cssgzip -k -9 style.css menghasilkan style.css.gz dengan tingkat kompresi maksimal. Tambahkan langkah ini ke pipeline build frontend kalian.
Browser menyimpan aset yang diberi izin cache. Atur dengan header:
example.com {
root * /var/www
header {
Cache-Control "public, max-age=86400"
}
file_server
}Cache-Control public, max-age=86400 membuat browser menyimpan respons selama sehari. Untuk aset yang tidak pernah berubah:
example.com {
@aset {
path /static/*
}
header @aset Cache-Control "public, max-age=31536000, immutable"
root * /var/www
file_server
}immutable memberi tahu browser bahwa aset dengan nama hash tidak akan berubah — boleh disimpan selama setahun. header @aset ... menerapkannya hanya pada path /static/*.
Karena aset hashed boleh di-cache lama, pastikan nama file berubah saat konten berubah. Alat build modern (webpack, vite) menambahkan hash pada nama file otomatis — style.a1b2c3.css. Inilah cache busting: konten baru, nama baru, browser mengambil versi baru.
Caddy mengaktifkan HTTP/2 dan HTTP/3 secara otomatis:
Tidak ada konfigurasi yang dibutuhkan — kalian hanya perlu memastikan port UDP 443 tidak diblokir firewall.
Yang penting kalian lakukan: biarkan Caddy memilih protokol dan jangan menurunkan versi secara paksa.
Untuk beban produksi, sesuaikan batas koneksi:
{
servers {
protocols h1 h2 h3
max_header_size 64KB
timeouts {
idle 5m
}
}
}
example.com {
encode zstd gzip
root * /var/www
file_server
}protocols h1 h2 h3 — aktifkan semua protokol termasuk QUIC.max_header_size 64KB — batasi ukuran header.idle 5m — koneksi menganggur bertahan 5 menit sebelum ditutup.Keep-alive menjaga koneksi tetap hidup antar request, menghindari biaya handshake berulang. Sesuaikan idle dengan pola traffic — terlalu pendek membuat koneksi sering dibuat ulang, terlalu panjang menahan resource.
Caddy menangani buffer dan connection pooling secara internal. Untuk reverse proxy, kita sudah melihat dial_timeout dan max_conns_per_host di episode 14. Prinsipnya: biarkan default, ubah hanya saat ada masalah yang terukur.
Episode 21 mengoptimalkan performa: encode untuk kompresi gzip, brotli, dan zstd, precompressed files untuk menghemat CPU, Cache-Control untuk aset statis dengan immutable dan cache busting, HTTP/2 dan HTTP/3 yang otomatis, serta tuning keep-alive dan timeouts.
Inti yang harus dibawa pulang:
encode zstd gzip memberikan kompresi terbaik dengan fallback.Cache-Control public, max-age=31536000, immutable untuk aset hashed.idle timeout memengaruhi biaya koneksi.Di episode 22 selanjutnya kita akan membahas logging & monitoring — directive log dengan format Common, JSON, dan custom, output ke file atau stdout, akses log fields, agregasi dengan ELK dan Loki, Prometheus metrics via admin API, serta teknik debugging dengan log level.