Episode ini membahas WebSocket dan aplikasi real-time: deteksi otomatis koneksi upgrade, reverse proxy WebSocket, aplikasi seperti Socket.io dan chat real-time, troubleshooting timeout, serta pertimbangan load balancer untuk koneksi panjang.

Aplikasi modern butuh komunikasi dua arah secara real-time: chat, notifikasi, collaborative editing, game. Teknologi di baliknya adalah WebSocket — koneksi persisten di mana server bisa mengirim data tanpa diminta. Episode 25 membahas bagaimana Caddy menangani WebSocket.
Kabar baiknya: WebSocket di Caddy hampir tidak butuh konfigurasi. Caddy mendeteksi header upgrade dan mem-proxy koneksi secara otomatis. Tapi ada nuansa penting — timeout, buffer, load balancer, dan aplikasi seperti Socket.io yang perlu perhatian khusus.
Setelah episode ini, kalian bisa mengekspos aplikasi real-time apa pun ke internet dengan percaya diri.
WebSocket dimulai sebagai request HTTP biasa dengan header upgrade:
chat.example.com {
reverse_proxy localhost:9000
}Caddy melihat header Upgrade: websocket dan Connection: Upgrade, lalu mengangkat koneksi menjadi full-duplex. Tidak ada directive khusus — reverse_proxy sudah cukup.
Selama proxy WebSocket aktif, Caddy mempertahankan koneksi ke backend selama klien terhubung. Inilah kenapa timeout untuk koneksi panjang perlu diperhatikan.
Koneksi WebSocket bisa bertahan sangat lama. Jika ada timeout yang memutus koneksi, periksa opsi transport:
chat.example.com {
reverse_proxy localhost:9000 {
transport http {
read_timeout 1h
write_timeout 1h
}
}
}read_timeout 1h dan write_timeout 1h memberi kelonggaran untuk koneksi real-time. Default Caddy sudah ramah WebSocket, tapi jika koneksi terputus tiba-tiba, pastikan timeout tidak terlalu pendek.
Beberapa aplikasi butuh header tertentu. Misalnya aplikasi yang mengidentifikasi klien asli:
chat.example.com {
reverse_proxy localhost:9000 {
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
}
}header_up X-Real-IP {remote_host} memberi aplikasi IP asli klien — penting untuk rate limiting di sisi aplikasi.
Socket.io memakai WebSocket dengan protokol tambahan. Untuk integrasi penuh, konfigurasinya:
chat.example.com {
reverse_proxy localhost:3000 {
header_up X-Real-IP {remote_host}
}
}Socket.io juga menggunakan HTTP untuk handshake dan fallback polling. Karena Caddy mem-proxy keduanya dengan benar, tidak ada konfigurasi khusus yang dibutuhkan — reverse_proxy menangani handshake HTTP dan upgrade WebSocket sekaligus.
Semua ini bekerja lewat satu directive reverse_proxy yang sama.
read_timeout dan write_timeout di transport.header_up.round_robin jika aplikasi stateful — pertimbangkan sticky session (episode 15).Saat koneksi bermasalah:
caddy run --config Caddyfile --debug
curl -i -N -H "Connection: Upgrade" \
-H "Upgrade: websocket" \
-H "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==" \
-H "Sec-WebSocket-Version: 13" \
http://localhost/chatcurl -i -N -H "Connection: Upgrade" mensimulasikan handshake WebSocket secara manual. Jika respons menunjukkan 101 Switching Protocols, proxying bekerja. --debug menampilkan detail upgrade di log.
Koneksi WebSocket tidak seperti request HTTP biasa yang selesai dalam milidetik. Pertimbangan saat memakai load balancing:
Untuk aplikasi stateless real-time, round_robin tetap baik. Untuk yang menyimpan state di memori, tambahkan lb_policy cookie (episode 15).
WebSocket identik dengan koneksi persisten yang memakai memori. Sebelum menambah banyak instance, pastikan aplikasi mendukung distribusi state (Redis pub/sub, shared store). Kalau tidak, banyak instance justru membuat sesi terpecah.
Episode 25 membahas WebSocket di Caddy: deteksi otomatis upgrade, reverse_proxy yang menangani koneksi full-duplex, aplikasi seperti Socket.io dan chat real-time, troubleshooting timeout dan header, serta pertimbangan load balancer untuk koneksi panjang.
Inti yang harus dibawa pulang:
reverse_proxy — tidak ada config khusus.read_timeout dan write_timeout untuk koneksi panjang.curl dengan header upgrade bisa menguji handshake.Di episode 26 selanjutnya kita akan membahas gRPC & modern protocols — kebutuhan HTTP/2 untuk gRPC, reverse proxy dengan transport h2c, load balancing gRPC, gRPC-Web untuk browser, serta pengaktifan HTTP/3 (QUIC) dengan konfigurasi UDP port.