Dalam dunia DevOps dan SRE modern load balancing dan high availability (HA) bukan lagi fitur tambahan saja, melainkan sebuah keharusan untuk menjaga agar aplikasi tetap dapat diakses dan memiliki kinerja yang optimal.
Pada tutorial kali ini saya akan memberikan penjelasan dan gambaran terkait dengan Load Balancing dengan HAProxy.
Struktur Proyek
haproxy-lb-demo/ ├── docker-compose.yml ├── haproxy/ │ └── haproxy.cfg ├── app1/index.html ├── app2/index.html └── app3/index.html
Buat Aplikasi Web Sederhana
Setiap aplikasi hanya menampilkan halaman HTML statis untuk mengidentifikasi dirinya.
mkdir -p haproxy-lb-demo/{app1,app2,app3,haproxy}
cd haproxy-lb-demo
echo "<h1>Halo, ini server 1</h1>" > app1/index.html
echo "<h1>Halo, ini server 2</h1>" > app2/index.html
echo "<h1>Halo, ini server 3</h1>" > app3/index.html
Konfigurasi HAProxy
Buat file haproxy/haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
# Frontend: terima traffic di port 80
frontend http_front
bind *:80
stats uri /haproxy?stats # Dashboard monitoring
default_backend http_back
# Backend: distribusikan beban ke 3 aplikasi
backend http_back
balance roundrobin
option httpchk GET /index.html # Health check
http-check expect status 200
server server1 app1:80 check inter 2000 rise 2 fall 3
server server2 app2:80 check inter 2000 rise 2 fall 3
server server3 app3:80 check inter 2000 rise 2 fall 3
Definisikan Layanan dengan Docker Compose
Buat file docker-compose.yml
version: '3.8'
services:
app1:
image: nginx:alpine
volumes:
- ./app1:/usr/share/nginx/html:ro
expose:
- "80"
networks:
- lb-net
app2:
image: nginx:alpine
volumes:
- ./app2:/usr/share/nginx/html:ro
expose:
- "80"
networks:
- lb-net
app3:
image: nginx:alpine
volumes:
- ./app3:/usr/share/nginx/html:ro
expose:
- "80"
networks:
- lb-net
haproxy:
image: haproxy:2.8
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
ports:
- "8080:80"
networks:
- lb-net
networks:
lb-net:
driver: bridge
Deploy & Uji
# Jalankan semua layanan docker-compose up -d # Periksa status docker-compose ps
Ketika semua sudah berhasil berjalan maka akan ada 4 container seperti gambar berikut

Akses web menggunakan browser dan refresh beberapa kali dan perhatikan tampilannya. Web akan menampilkan konten yang berbeda beda ketika kita refresh.


Untuk memastikan HAProxy berjalan, kita bisa matikan salah satu container. Kemudian kita refresh lagi untuk melihat apakah load balancing berjalan dengan baik atau tidak.

Untuk melihat status real-time tiap backend (UP/DOWN), jumlah request, dan hasil health check kita bisa akses dengan endpoint berikut
http://43.xx.xx.238:8080/haproxy?stats
