Konfigurasi Load Balancing Nginx dan HAProxy

Load balancing adalah teknik mendistribusikan lalu lintas jaringan ke beberapa server untuk meningkatkan kinerja, ketersediaan, dan keandalan. Dengan load balancing, tidak ada satu server pun yang kewalahan menangani semua permintaan. Artikel ini membahas dua tool load balancing populer: Nginx dan HAProxy.

Pengertian Load Balancing

Load balancing mendistribusikan lalu lintas ke beberapa server (backend) agar tidak ada satu server yang kewalahan. Load balancer berfungsi sebagai "pramugari" yang mengarahkan penumpang ke berbagai gate yang tersedia.

Mengapa Load Balancing Penting?

  • High Availability: Jika satu server mati, server lain tetap melayani
  • Performance: Distribusi beban membuat semua server optimal
  • Scalability: Mudah menambah server saat lalu lintas meningkat
  • Zero Downtime: Maintenance bisa dilakukan tanpa menghentikan layanan
  • Reliability: Sistem yang lebih tangguh terhadap kegagalan

Jenis Load Balancer

  • Layer 4 (Transport): Berdasarkan IP dan port (TCP/UDP)
  • Layer 7 (Application): Berdasarkan isi request (HTTP/HTTPS)
  • Hardware: Perangkat fisik seperti F5 BIG-IP
  • Software: Nginx, HAProxy, Envoy

Pengertian Nginx sebagai Load Balancer

Nginx adalah web server yang juga bisa digunakan sebagai load balancer Layer 7. Nginx sangat populer karena mudah dikonfigurasi dan memiliki fitur lengkap sebagai reverse proxy dan load balancer.

Keunggulan Nginx Load Balancer

  • Sudah terpasang: Banyak server sudah menjalankan Nginx
  • Satu alat untuk semua: Web server, reverse proxy, load balancer, cache
  • Konfigurasi sederhana: Mudah dipahami oleh pemula
  • HTTP-aware: Mengerti protokol HTTP/HTTPS dengan baik
  • Health check: Otomatis mendeteksi server yang mati

Pengertian HAProxy

HAProxy adalah load balancer Layer 4 dan Layer 7 yang sangat powerful dan dioptimalkan untuk kinerja tinggi. HAProxy digunakan oleh perusahaan besar seperti GitHub, StackOverflow, dan Reddit.

Keunggulan HAProxy

  • Performa luar biasa: Memproses jutaan koneksi per detik
  • Layer 4 dan 7: Mendukung kedua layer sekaligus
  • Advanced health check: Lebih detail dan fleksibel
  • SSL termination: HTTPS handling yang sangat efisien
  • Statistik real-time: Dashboard bawaan untuk monitoring

Perbandingan Nginx vs HAProxy

AspekNginxHAProxy
PerformaBaikSangat tinggi
KonfigurasiSedangSedang
Layer 4TerbatasPenuh
Layer 7PenuhPenuh
SSLBaikSangat baik
StatistikDasarLanjutan
Cocok UntukUmumHigh-traffic
Kurva BelajarMudahSedang

Rekomendasi: Gunakan Nginx jika sudah familiar dengannya. Gunakan HAProxy untuk traffic tinggi dan kebutuhan load balancing yang kompleks.

Alat yang Dibutuhkan

  • Server Debian 13
  • Minimal 2 server backend (atau 1 server dan 1 dummy)
  • Akses SSH sebagai root atau sudo
  • Docker opsional (untuk testing)

Konfigurasi Load Balancing dengan Nginx

1. Instal Nginx

bash
apt install nginx -y

2. Konfigurasi Upstream

Buat file /etc/nginx/conf.d/load-balancer.conf:

nginx
# Definisikan backend servers
upstream backend {
    # Metode load balancing:
    # round-robin (default), least_conn, ip_hash, weight
    
    # Weight = bobot (beban proporsional)
    server 192.168.1.10:80 weight=3;
    server 192.168.1.11:80 weight=2;
    server 192.168.1.12:80 weight=1;
    
    # Least_conn = kirim ke server dengan koneksi paling sedikit
    # least_conn;
    
    # IP Hash = kirim ke server yang sama berdasarkan IP client
    # ip_hash;
    
    # Health check timeout
    server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}

server {
    listen 80;
    server_name masyarakat.id;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Timeout
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

3. Konfigurasi SSL Termination

nginx
upstream backend {
    server 192.168.1.10:80;
    server 192.168.1.11:80;
}

server {
    listen 443 ssl;
    server_name masyarakat.id;
    
    ssl_certificate /etc/letsencrypt/live/masyarakat.id/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/masyarakat.id/privkey.pem;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
    }
}

4. Health Check dengan Nginx

nginx
upstream backend {
    server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
}

# Health check aktif dengan nginx_upstream_check_module
location /health {
    access_log off;
    return 200 "healthy\n";
    add_header Content-Type text/plain;
}

5. Aktifkan dan Restart

bash
nginx -t
systemctl reload nginx

Konfigurasi Load Balancing dengan HAProxy

1. Instal HAProxy

bash
apt install haproxy -y

2. Konfigurasi HAProxy

Edit /etc/haproxy/haproxy.cfg:

haproxy
# Konfigurasi global
global
    log /dev/log local0
    log /dev/log local1 notice
    maxconn 4096
    user haproxy
    group haproxy
    daemon

# Konfigurasi default
defaults
    log     global
    mode    http
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

# Frontend - menerima request dari client
frontend http_front
    bind *:80
    default_backend http_back

# Backend - mendistribusikan ke server
backend http_back
    balance roundrobin
    
    # Health check
    option httpchk GET /health
    http-check expect status 200
    
    # Server backend
    server web1 192.168.1.10:80 check inter 2000 fall 3 rise 2
    server web2 192.168.1.11:80 check inter 2000 fall 3 rise 2
    server web3 192.168.1.12:80 check inter 2000 fall 3 rise 2

# Dashboard statistik
listen stats
    bind *:9090
    mode http
    stats enable
    stats uri /haproxy?stats
    stats auth admin:HaproxyAdmin123!
    stats refresh 10s

3. Aktifkan dan Restart

bash
haproxy -c -f /etc/haproxy/haproxy.cfg
systemctl enable haproxy
systemctl restart haproxy

4. Akses Dashboard Statistik

Buka browser ke http://server-ip:9090/haproxy?stats

  • Username: admin
  • Password: HaproxyAdmin123!

Health Check Detail

Health Check di Nginx

nginx
upstream backend {
    server 192.168.1.10:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:80 backup;  # Backup server
}

Penjelasan:

  • max_fails=3: 3 percobaan gagal → server ditandai mati
  • fail_timeout=30s: 30 detik server dianggap mati
  • backup: Server cadangan yang hanya digunakan jika semua server lain mati

Health Check di HAProxy

haproxy
server web1 192.168.1.10:80 check inter 2000 fall 3 rise 2

Penjelasan:

  • check: Aktifkan health check
  • inter 2000: Periksa setiap 2 detik
  • fall 3: 3 kali gagal → server mati
  • rise 2: 2 kali berhasil → server hidup lagi

Health Check Berbagai Protokol

haproxy
# HTTP check
option httpchk GET /health HTTP/1.1\r\nHost:localhost

# HTTPS check
option httpchk GET /health
ssl-hello-chk

# TCP check (untuk database)
server db1 192.168.1.20:3306 check port 3306 inter 5s

Algoritma Load Balancing

1. Round Robin (Default)

Mendistribusikan request secara bergantian:

nginx
upstream backend {
    server 192.168.1.10:80;
    server 192.168.1.11:80;
}

2. Least Connections

Kirim ke server dengan koneksi paling sedikit:

nginx
upstream backend {
    least_conn;
    server 192.168.1.10:80;
    server 192.168.1.11:80;
}

3. IP Hash

Client yang sama selalu ke server yang sama (untuk session persistence):

nginx
upstream backend {
    ip_hash;
    server 192.168.1.10:80;
    server 192.168.1.11:80;
}

4. Weight (Beban Proporsional)

Bobot berdasarkan kemampuan server:

nginx
upstream backend {
    server 192.168.1.10:80 weight=5;  # Server kuat
    server 192.168.1.11:80 weight=2;  # Server sedang
    server 192.168.1.12:80 weight=1;  # Server lemah
}

5. HAProxy Algorithms

haproxy
balance roundrobin      # Default, bergantian
balance leastconn       # Koneksi paling sedikit
balance uri             # Berdasarkan URI
balance url_param       # Berdasarkan parameter URL
balance hdr(User-Agent) # Berdasarkan header
balance source          # Berdasarkan IP client

Failover dan High Availability

Failover dengan Nginx

nginx
upstream backend {
    server 192.168.1.10:80;
    server 192.168.1.11:80 backup;  # Cadangan
    server 192.168.1.12:80 backup;  # Cadangan
}

Failover dengan HAProxy

haproxy
backend http_back
    option httpchk GET /health
    
    server web1 192.168.1.10:80 check inter 2000 rise 2 fall 3
    server web2 192.168.1.11:80 check inter 2000 rise 2 fall 3 backup

Multi-Load Balancer (Active-Passive)

Menggunakan Keepalived untuk HA load balancer:

bash
apt install keepalived -y

Konfigurasi /etc/keepalived/keepalived.conf:

kode
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        192.168.1.100/24
    }
    track_script {
        chk_haproxy
    }
}

IP virtual 192.168.1.100 akan berpindah antar load balancer.

SSL Termination

Nginx SSL Termination

nginx
server {
    listen 443 ssl;
    server_name masyarakat.id;
    
    ssl_certificate /etc/letsencrypt/live/masyarakat.id/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/masyarakat.id/privkey.pem;
    
    location / {
        proxy_pass http://backend;
        proxy_set_header X-Forwarded-Proto https;
    }
}

HAProxy SSL Termination

haproxy
frontend https_front
    bind *:443 ssl crt /etc/haproxy/certs/masyarakat.id.pem
    default_backend http_back

# Gabungkan certificate dan key
cat certificate.crt private.key > /etc/haproxy/certs/masyarakat.id.pem

Monitoring Load Balancer

Nginx Status

bash
# Install module status
apt install libnginx-mod-nchan

# Lihat koneksi aktif
nginx -T | grep upstream

HAProxy Stats

bash
# Akses dashboard web
http://server-ip:9090/haproxy?stats

# Cek status via CLI
echo "show stat" | sudo socat stdio /var/run/haproxy.sock

Monitoring dengan Prometheus

yaml
# Tambahkan ke docker-compose.yml
prometheus:
  image: prom/prometheus
  ports:
    - "9090:9090"
  volumes:
    - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml

Troubleshooting

1. Load Balancer Tidak Mendistribusikan ke Semua Server

Penyebab: Health check gagal atau server belum siap. Solusi:

bash
# Cek status server backend
curl http://192.168.1.10:80/health
# Cek log load balancer
tail -f /var/log/nginx/error.log
tail -f /var/log/haproxy.log

2. Semua Traffic ke Satu Server

Penyebab: Algorithm salah atau IP hash menyebabkan sticky session. Solusi:

nginx
# Ganti ke round-robin
upstream backend {
    server 192.168.1.10:80;
    server 192.168.1.11:80;
}

3. Timeout Terlalu Singkat

Penyebab: Timeout default terlalu pendek untuk aplikasi berat. Solusi:

nginx
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
proxy_send_timeout 120s;

4. Session Tidak Konsisten (User Login Ke Server Berbeda)

Penyebab: Sticky session tidak dikonfigurasi. Solusi:

nginx
upstream backend {
    ip_hash;  # Atau gunakan cookie
}

5. Server Baru Tidak Masuk ke Pool

Penysebab: Health check belum berhasil. Solusi:

bash
# Tunggu sampai health check berhasil
# Atau cek log untuk melihat mengapa gagal
tail -f /var/log/haproxy.log

6. SSL Certificate Error

Penyebab: Certificate belum dikonfigurasi di load balancer. Solusi:

bash
# Verifikasi certificate
openssl x509 -in /etc/letsencrypt/live/masyarakat.id/fullchain.pem -noout -dates
# Pastikan Nginx/HAProxy menggunakan path yang benar

Kesimpulan

Load balancing dengan Nginx dan HAProxy adalah teknik essential untuk website yang membutuhkan ketersediaan tinggi dan performa optimal. Nginx cocok untuk kebutuhan umum dan sudah familiar bagi kebanyakan administrator. HAProxy lebih powerful untuk traffic tinggi dan kebutuhan load balancing yang kompleks.

Kombinasi load balancer, health check, SSL termination, dan monitoring memberikan solusi lengkap untuk website yang reliable dan cepat. Dengan failover dan high availability, layanan tetap berjalan meskipun ada server yang bermasalah.

Kunci utama:

  • Pilih algorithm load balancing sesuai kebutuhan (round-robin untuk umum, least_conn untuk beban tidak merata)
  • Selalu aktifkan health check agar server yang mati otomatis dikeluarkan
  • Gunakan SSL termination di load balancer untuk mengurangi beban backend
  • Backup konfigurasi sebelum melakukan perubahan
  • Monitor statistik load balancer secara rutin
Catatan penting: Jangan pernah menjalankan load balancer di server yang sama dengan application server — ini akan menghilangkan tujuan load balancing. Jika load balancer mati, semua layanan ikut mati. Gunakan Keepalived atau solusi HA lainnya untuk memastikan load balancer sendiri tidak menjadi single point of failure. Selalu backup konfigurasi load balancer secara berkala.
Ingat: Load balancing bukan hanya tentang mendistribusikan traffic — ini adalah strategi untuk menjadikan website Anda selalu tersedia, cepat, dan dapat diskalakan. Mulailah dari yang sederhana dengan Nginx, dan tingkatkan ke HAProxy ketika traffic Anda membutuhkannya.
Dipublikasikan untuk membantu para administrator server dalam mengkonfigurasi load balancing untuk website yang reliable dan berkinerja tinggi.

Artikel Terkait