📑 Daftar Isi
- Kenapa Server Kamu Butuh Load Balancer?
- Yang Perlu Kamu Siapkan
- Langkah 1: Install HAProxy
- Langkah 2: Kenalan Sama Struktur Config
- Langkah 3: Bikin Config Dasar
- Langkah 4: Validasi Config Sebelum Jalan
- Langkah 5: Testing dan Cek Log
- Langkah 6: Buka Firewall
- Tabel Troubleshooting Cepat
- Hal-hal yang Dulu Bikin Aku Muter-muter
- Kesimpulan Singkat
Cara Setup Load Balancer HAProxy di VPS: Panduan Step-by-Step untuk Pemula
Pas tahun 2021, aku masih kerja sebagai NOC junior di sebuah perusahaan hosting kecil. Ada satu malam yang sampai sekarang masih aku inget: pertama kali disuruh setup load balancer HAProxy buat client, dan jujur aja, waktu itu aku mikir kalau ini cuma soal nulis beberapa baris config terus jalan. Ternyata… gak segampang itu. Malam itu aku belajar banyak hal yang gak bakal pernah diajarin di kelas.
Kalau dipikir-pikir, konsepnya sebenernya sederhana. Bayangin antrean di Indomaret: satu kasir, semua ngantre panjang. Kasirnya ditambah dua, antrean langsung pecah. Nah, HAProxy itu kayak satpam yang ngaturin pelanggan ke kasir yang lagi kosong, pakai aturan yang bisa kita tentuin sendiri. Tapi di dunia nyata, “satpam” ini kudu cerdas, kudu bisa ngerasain kasir mana yang lagi sibuk, dan kudu tahan banting. Gak cuma nyuruh orang lewat doang.
Kenapa Server Kamu Butuh Load Balancer?
Masalah klasiknya selalu sama: server satu, traffik gak nahan. Kamu mulai nemu gejala kayak response time yang makin ngaret, client mulai ngeluh websitenya lelet, atau malah timeout di jam-jam tertentu. Coba cek CPU usage-nya, udah mentok 90 persen ke atas terus. Load average di atas jumlah core. Itu semua adalah jeritan server yang lagi bilang, “aku kewalahan, tolong!”
Terus banyak orang langsung jawab: “ya udah upgrade aja server-nya.” Upgrade RAM, upgrade CPU, pindah ke plan yang lebih gede. Sah-sah saja sih, tapi coba dipikir lagi — kamu bakal bayar mahal buat resource yang cuma kepake di jam sibuk. Di luar jam itu, server nganggur. Daripada gitu, kenapa gak bagi beban ke dua atau tiga server yang harganya lebih masuk akal? Nah, itu esensi dari load balancing: bukan nambah satu mesin raksasa, tapi pakai beberapa mesin biasa yang kerjanya barengan.
Dan di sinilah HAProxy masuk. HAProxy itu open source, gratis, udah matang, dan dipake di ribuan production server di seluruh dunia. Instalnya gampang, config-nya relatif simpel, dan yang paling penting dia bisa ngatur banyak backend sekaligus lengkap dengan health check yang bisa diandalin. Buat VPS yang jalanin Nginx atau Apache, HAProxy duduk paling depan dan jadi pintu masuk semua request.
Yang Perlu Kamu Siapkan
Sebelum mulai, kita rapikan dulu peta mainan yang mau dipakai. Buat panduan ini, skenarionya gini:
- Dua server web (Nginx) yang masing-masing jalanin aplikasi yang sama — sebut aja web-1 dan web-2
- Satu VPS khusus buat HAProxy sebagai load balancer
- Setiap server udah dikunci firewall-nya, cuma port yang perlu yang kebuka

Jadi alurnya gini: user akses domain.com → masuk ke HAProxy → diteruskan ke web-1 atau web-2. Kalau salah satu server web mati atau lemot, HAProxy otomatis ngirim traffik ke server yang masih sehat. Kalau server web-mu belum ada yang jalanin Nginx, cek dulu panduan install Nginx di VPS biar gak pusing di tengah jalan.
Langkah 1: Install HAProxy
Di Ubuntu 22.04, HAProxy udah ada di repositori resmi. Tinggal jalanin perintah ini sebagai root atau pakai sudo:
apt update
apt install haproxy -y
haproxy -v
Output yang diharapkan kurang lebih kayak gini:
HAProxy version 2.6.x
Copyright 2000-2022 Willy Tarreau et al.
Kalau versinya udah muncul, berarti install berhasil. Catatan kecil: di distribusi yang lebih baru, versi HAProxy-nya bisa beda-beda dikit, tapi buat kebutuhan dasar sih gak masalah.
Langkah 2: Kenalan Sama Struktur Config
File config utama HAProxy ada di /etc/haproxy/haproxy.cfg. Sebelum sentuh-sentuh, mending kita pahamin dulu empat seksi utama yang paling sering kepake:
- global — settingan proses HAProxy itu sendiri, kayak user, jumlah koneksi maksimal, dan opsi SSL
- defaults — nilai default yang dipake semua frontend dan backend di bawahnya
- frontend — pintu masuk request, tempat nentuin IP dan port yang didengerin
- backend — tujuan request, di sini daftar server web yang mau dibagi bebannya
Ibarat restoran, frontend itu bagian pelayanan yang nerima tamu, backend itu dapurnya. Tamu masuk lewat depan, terus diarahkan ke meja yang… eh, dapur yang lagi kosong.
Langkah 3: Bikin Config Dasar
Oke, waktunya bikin config. Aku saranin backup dulu config aslinya biar aman:
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
Terus buka file-nya dan ganti isinya dengan config di bawah ini. Tenang, tiap barisnya bakal aku jelasin pelan-pelan.
global
log /dev/log local0
maxconn 50000
user haproxy
group haproxy
defaults
mode http
log global
option httplog
option dontlognull
retries 3
timeout connect 5s
timeout client 30s
timeout server 30s
frontend http-in
bind *:80
default_backend web-servers
backend web-servers
balance roundrobin
option httpchk GET /health
server web-1 10.0.0.11:80 check
server web-2 10.0.0.12:80 check
Nih, breakdown singkatnya:
- mode http bikin HAProxy kerja di layer 7, jadi bisa baca isi request HTTP
- balance roundrobin artinya request dibagi giliran rata ke setiap server
- option httpchk GET /health ini health check. HAProxy bakal ngecek URL /health tiap beberapa detik; kalau server gak jawab, dia langsung dikeluarin dari daftar backend
- check di akhir baris server itu yang ngeaktifin health check buat server tersebut
Buat alamat IP-nya, ganti sesuai server web kamu ya. Jangan lupa aplikasi web-nya juga bikin endpoint /health yang balikin status 200. Simpel banget — bikin file kosong atau response “ok” aja udah cukup.
Langkah 4: Validasi Config Sebelum Jalan
Ini kebiasaan yang wajib aku tanamkan ke semua orang yang aku ajarin: selalu cek config sebelum restart service. HAProxy punya alat cek bawaan:
haproxy -c -f /etc/haproxy/haproxy.cfg
Kalau config-nya bener, output-nya kurang lebih gini:
Configuration file is valid
Kalau ada yang salah, dia bakal nunjukin baris mana yang bermasalah. Jangan pernah skip langkah ini. Dulu aku pernah skip, hasilnya? Service gak mau jalan dan client lagi nunggu. Pelajaran mahal.
Kalau udah valid, baru restart:
systemctl restart haproxy
systemctl status haproxy
Biasanya service langsung active (running).
Langkah 5: Testing dan Cek Log
Nah, sekarang bagian paling seru. Dari server lain, coba akses domain atau IP load balancer-nya beberapa kali:
curl -I http://lb.example.com
curl http://lb.example.com
Buat mastiin traffik kebagi rata, cek log HAProxy:
tail -f /var/log/haproxy.log
Kamu bakal liat baris kayak gini:
web-servers/web-1 0/0/0/5/6 200 1234 - - ---- 2/2/1/1/0 0/0 "GET / HTTP/1.1"
web-servers/web-2 0/0/0/4/5 200 1234 - - ---- 2/2/1/1/0 0/0 "GET / HTTP/1.1"
Perhatiin bagian paling awal ada nama backend dan server yang ngelayani request. Kalau web-1 dan web-2 muncul bergantian, berarti round robin-nya jalan. Kalau cuma satu terus, ada yang salah dengan health check-nya. Buat mastiin health check-nya bener-bener jalan, coba matiin sebentar salah satu server web, terus perhatiin log-nya — HAProxy bakal nyatet kalau server itu down dan gak ngirim traffik ke sana lagi. Gila kan, seru banget ngeliatnya.
Omong-omong soal log, ini juga waktu yang pas buat mulai biasain monitoring. Kalau nanti traffik kamu makin gede, kamu bakal butuh pandangan yang lebih jelas soal kondisi server. Panduan monitoring server pakai Netdata ini bisa jadi langkah pertama yang bagus.
Langkah 6: Buka Firewall
Jangan lupa, HAProxy-nya sendiri juga kudu bisa ditelepon dari luar. Pastikan port 80 (dan nanti 443) kebuka di firewall VPS:
ufw allow 80/tcp
ufw allow 443/tcp
Kalau pakai cloud provider kayak DigitalOcean atau Vultr, cek juga security group atau firewall panelnya. Detail lengkap soal setup firewall bisa dibaca di panduan setting firewall VPS ini.
Tabel Troubleshooting Cepat
Berikut tabel yang dulu banget aku harap ada pas baru belajar HAProxy:
| Gejala | Kemungkinan Penyebab | Solusi |
|---|---|---|
| 502 Bad Gateway | Semua backend down atau gak bisa dijangkau | Cek status backend di log, perbaiki health check |
| 503 Service Unavailable | Gak ada server yang lolos health check | Cek endpoint /health di masing-masing server |
| Traffik cuma ke satu server | Health check salah atau server lain down | Cek log health check, verify endpoint /health |
| Koneksi lemot banget | Timeout kekecilan atau server kewalahan | Naikin timeout, tambah backend server |
| Config valid tapi service gagal start | Port 80 udah kepake proses lain | Perbaiki bind, matiin service lain atau ganti port |
Hal-hal yang Dulu Bikin Aku Muter-muter
Oke, ini curhat dikit biar kamu gak ngulangin perjalananku yang berputar-putar. Pertama, sticky session. Kalau aplikasi kamu nyimpen session di dalam server lokal (bukan di database atau Redis), request dari user yang sama bisa nyasar ke server beda, dan session-nya ilang. Solusinya pakai cookie: cookie SRV insert indirect nocache di frontend dan cookie web-1 / cookie web-2 di masing-masing baris server. Buat penjelasan lebih dalam soal session di aplikasi PHP, artikel setup Redis ini bisa jadi bacaan lanjutan yang bagus.
Kedua, jangan anggap enteng health check. Health check yang cuma ngecek port aja (tanpa option httpchk) itu lumayan buta — server bisa aja balas di port 80 tapi sebenarnya aplikasinya lagi error. Health check yang bener harus ngecek sesuatu yang mewakili “aplikasi ini hidup”. Makanya tadi aku saranin endpoint /health khusus.
Ketiga, dan ini penting banget: HAProxy yang satu itu single point of failure. Kalau HAProxy-nya mati, semua request berhenti, sehebat apapun backend-nya. Buat skala production, minimal pikirin soal failover atau pakai dua HAProxy dengan keepalived (VRRP). Tapi itu cerita lain, nanti-nanti deh.
Kesimpulan Singkat
Load balancer itu bukan teknologi yang gimana-gimana amat, tapi kalau salah setup, dampaknya ke seluruh production. Mulai dari yang sederhana dulu: pahami struktur config, bikin health check yang bener, selalu validasi config sebelum restart, dan jangan lupa firewall. Dari situ kamu bisa naik ke level berikutnya — SSL termination, zero-downtime reload, sampai high availability. Kalau kamu udah siap naik level, artikel setup HAProxy production-ready dengan SSL termination bisa jadi lanjutannya.
Q: Apakah HAProxy cuma bisa buat layanan HTTP?
Gak juga. HAProxy bisa jalan di mode tcp buat layanan non-HTTP kayak MySQL, SMTP, WebSocket, atau PostgreSQL. Cukup ganti mode http jadi mode tcp di bagian yang relevan. Tapi buat layanan database, pastikan aplikasi kamu emang bisa handle koneksi yang berpindah-pindah server.
Q: Pasang SSL di HAProxy atau di server web?
Dua-duanya bisa. Cara paling umum adalah SSL termination di HAProxy, jadi sertifikat dihandle sekali di depan, lalu trafik ke belakang pake HTTP biasa. Tapi kalau butuh end-to-end encryption, bisa juga pakai mode tcp SSL passthrough. Masing-masing ada trade-off-nya.
Q: Bagaimana caranya kalau satu server web harus dapet beban lebih besar?
Pakai balance weighted roundrobin. Di config HAProxy kamu bisa kasih nilai weight, contohnya server web-1 10.0.0.11:80 check weight 3 dan web-2 check weight 1. Artinya web-1 dapet tiga kali lipat request dibanding web-2.
Q: Satu HAProxy doang cukup buat production?
Buat beban kecil sampai menengah, cukup kok. Tapi ingat, HAProxy jadi single point of failure. Kalau traffik kamu kritis dan butuh uptime tinggi, pertimbangkan dua HAProxy dengan keepalived supaya ada failover otomatis.
Semoga cerita malam itu ada gunanya buat kamu yang lagi mau mulai belajar load balancer. Kalau kamu pernah ngalamin momen “kok segini ribetnya” pas setup HAProxy pertama kali, atau punya cerita horor lain soal load balancer, share di komentar dong. Mugi-mugi artikel ini jadi penolong buat kamu yang lagi kesusahan di malam hari, kayak aku dulu.