Kami sadar bahwa sebagian besar sysop akan menggunakan NGINX atau bahkan Traefik jika membutuhkan server reverse proxy web. Akan tetapi, pilihan utama Kami sebagai server web reverse-proxy adalah Caddy. Berikut akan Kami jelaskan mengapa Kami menyukai Caddy.
Apa itu reverse proxy? Link to heading
Server Proxy Web adalah sebuah server yang menjadi server perantara dalam mengakses server web lain. Dahulu, ketika orang menyebut proxy web, biasanya yang dimaksud adalah sebuah server proxy yang digunakan untuk mengakses server-server web di Internet. Jadi alurnya adalah di dalam suatu lingkungan, jika ingin mengakses server web di luar (Internet), harus melalui server proxy tersebut. Hal ini dilakukan karena beberapa hal, diantaranya adalah karena masalah keamanan, web-caching, atau untuk menangani bagaimana IP-IP privat di LAN mengakses Internet publik. Ada masa dimana Squid menjadi web-caching proxy yang sangat populer. Akan tetapi, praktik ini sudah tidak banyak digunakan lagi. Diantaranya karena semakin umumnya penerapan NAT. Selain itu web-caching juga semakin tidak relevan di saat ini karena semakin dinamisnya konten-konten yang ada di web.
Proxy yang banyak digunakan saat ini adalah server yang berfungsi untuk mengakses server-server di dalam dari luar (Internet). Hal ini sering dibutuhkan karena biasanya servis-servis di dalam menggunakan IP privat yang tidak bisa diakses dari Internet publik.
Misal lingkungan Kami. Banyak servis berjalan di VM yang menggunakan IP privat, selain karena efisiensi penggunaan IP publik yang terbatas, juga dikarenakan pertimbangan keamanan. Selain itu seringkali satu VM menjalankan beberapa servis web yang berjalan di port-port yang berbeda. Bagaimana caranya agar servis-servis tersebut dapat diakses dengan menggunakan satu IP dan tetap menggunakan port standar 80 untuk HTTP dan 443 untuk HTTPS? Caranya adalah penggunaan server proxy yang memiliki IP publik yang akan meneruskan permintaan ke VM dan layanan terkait yang berjalan di IP privat dan port tidak standar.
Mengapa tidak menggunakan teknologi NAT? Karena penggunaan teknologi NAT tidak memungkinkan penggunaaan satu IP publik untuk beberapa servis dengan IP privat dan port berbeda. Hal ini dikarenakan NAT berjalan di “Layer 3”, dia tidak mengetahui servis mana yang dituju. Yang dia ketahui hanya permintaan masuk ke IP sekian dan port sekian. sedangkan untuk bisa mengetahui hostname apa yang diminta, dibutuhkan minimal “Layer 7”.
Metoda untuk meneruskan permintaan dari luar (Internet) ke dalam biasa secara spesifik disebut sebagai “reverse proxy”. Dan tentu saja, reverse proxy untuk aplikasi web yang menggunakan protokol HTTP, sering disebut sebagai “web reverse proxy” atau “http reverse proxy”. Namun, karena sebagian reverse proxy adalah reverse proxy web, akibatnya seringkali ketika orang-orang menyebut reverse proxy, yang dimaksud adalah reverse proxy untuk web.
Selain untuk meneruskan request yang diterima IP publik port standar ke IP ke IP private, reverse proxy juga sering digunakan sebagai “load-balancing” dan “failover”.
Apa itu Caddy? Link to heading
Caddy adalah server web opensource yang dikembangkan menggunakan Go.
Secara default, Caddy akan secara otomatis mendapatkan dan memperbaharui sertifikat TLS (atau biasa disebut orang sertifikat HTTPS) untuk semua situs yang dilayaninya. Tanpa download sertifikat secara manual dari CA. Tanpa membutuhkan script tambahan yang dijalankan berkala untuk memperbaharuinya.
Bagaimana Kami memanfaatkan Caddy? Link to heading
Sebagian besar penggunaan Caddy pada lingkungan Kami adalah sebagai reverse-proxy. Kami menyukainya karena hanya butuh beberapa baris saja untuk mengkonfigurasi pemetaan sebuah hostname ke servis yang dituju.
Contoh, untuk memetakan reverse-proxy grafana Kami, hanya dibutuhkan tambahan 3 baris pada file konfigurasi Caddy:
grafana-b.host2host.id {
reverse_proxy http://host.containers.internal:3000
}
Bandingkan jika Anda ingin mengkonfigurasi NGINX untuk pemetaan tersebut. Belum lagi sertifikat TLS secara otomatis akan dikelola oleh Caddy. Tidak perlu mendapatkan sertifikat secara manual, tidak membutuhkan script tambahan, semua otomatis hanya dengan 3 baris konfigurasi tersebut.
Bahkan dari 3 baris tersebut, bisa Kami jadikan 1 baris yang tetap dapat dengan mudah dibaca:
grafana-b.host2host.id { reverse_proxy http://host.containers.internal:3000 }
Kami juga menggunakan Caddy untuk “redirection”, misalnya:
kodesumber.com, www.kodesumber.com {
redir https://blog.kodesumber.com/
}
Sebagai “load-balancing” dan “failover”? Tentu bisa, berikut contoh bagaimana kami mengkonfigurasi servis “minio”:
s3.tektrans.id {
reverse_proxy {
to http://172.23.100.2 http://172.23.100.3 http://172.23.100.4 http://172.23.100.5
lb_policy least_conn
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-Host {host}
header_up Host {host}
health_uri /minio/health/ready
health_interval 10s
health_timeout 1s
}
}
Atau sebagai web server yang hanya melayani file statik:
xxx.example.com {
root * /var/local/xxx.example.com
file_server
try_files {path} {path} index.html
}
Pada intinya, selain baris konfigurasi yang dibutuhkan sedikit, syntax-nya juga mudah dipahami. Selain itu, seperti sebelumnya Kami jelaskan, semua sertifikat TLS otomatis dikelola Caddy. Ditambah semua request ke HTTP secara otomatis akan redirect ke HTTPS.
Satu poin lagi yang Kami sukai, Caddy secara default mendukung protokol “HTTP/3 Quic”. Tanpa perlu konfigurasi tambahan. Cukup pastikan firewall Anda terbuka untuk port 443/udp karena HTTP/3 Quic menggunakan UDP.
Jadi, secara garis besar, Caddy sangat memuaskan menjadi reverse-proxy ke servis-servis Kami yang dibuat menggunakan nodejs maupun berjalan sebagai container.
Bagaimana Kami menjalankan Caddy? Link to heading
Dahulu Kami menjalankan Caddy dengan menggunakan package dari distro. Akan tetapi sekarang, Kami sangat menyukai menjalankan Caddy sebagai container. Berikut contoh file quadlet untuk container Caddy kami:
# caddy.container
[Unit]
After=network-online.target
[Container]
ContainerName=caddy
Image=docker.io/caddy:2.9
AutoUpdate=registry
AddCapability=NET_ADMIN
PublishPort=80:80
PublishPort=443:443
PublishPort=443:443/udp
#PublishPort=2019:2019
Timezone=Asia/Jakarta
Volume=/etc/caddy:/etc/caddy:Z
Volume=caddy_data:/data
Volume=caddy_config:/config
Volume=caddy_log:/log
[Service]
ExecReload=/usr/bin/podman exec -w /etc/caddy caddy caddy reload
Restart=always
[Install]
WantedBy=default.target
Kelemahan? Link to heading
Sebenarnya, Kami sadar dan akui performa Caddy akan kalah dari NGINX atau Traefik jika dilakukan benchmark. Akan tetapi satu pertanyaan Kami, apakah Anda membutuhkan performa di atas ratusan ribu request per detik? Kami tidak pernah merasa Caddy menjadi bottleneck pada servis-servis Kami. Dan lagi Kami sangat menyukai dimana sertifikat TLS ditangani otomatis oleh Caddy tanpa perlu sedikit pun campur tangan dan konfigurasi tambahan. Kecepatan dan kesederhanaan deployment menjadi alasan utama Kami.
Oleh karena itu, Kami tetap memilih Caddy sebagai pilihan reverse-proxy Kami.