HxHippy

Load Balancing

Distributing traffic across multiple backend servers with Nginx.

Last updated: 2025-01-15

Basic Load Balancing

upstream backend {
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
    server 10.0.0.3:3000;
}

server {
    listen 80;

    location / {
        proxy_pass http://backend;
    }
}

Load Balancing Methods

Round Robin (Default)

upstream backend {
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
}

Weighted Round Robin

upstream backend {
    server 10.0.0.1:3000 weight=3;
    server 10.0.0.2:3000 weight=1;
    # Server 1 gets 3x the traffic
}

Least Connections

upstream backend {
    least_conn;
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
}

IP Hash (Sticky Sessions)

upstream backend {
    ip_hash;
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
    # Same client IP always goes to same server
}

Least Time (Nginx Plus)

upstream backend {
    least_time header;  # or 'last_byte'
    server 10.0.0.1:3000;
    server 10.0.0.2:3000;
}

Server Parameters

upstream backend {
    server 10.0.0.1:3000 weight=3;           # 3x traffic
    server 10.0.0.2:3000 backup;             # Only if others fail
    server 10.0.0.3:3000 down;               # Marked as unavailable
    server 10.0.0.4:3000 max_fails=3 fail_timeout=30s;
}

Health Checks (Passive)

upstream backend {
    server 10.0.0.1:3000 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:3000 max_fails=3 fail_timeout=30s;
}

# max_fails: Number of failed requests before marking server unavailable
# fail_timeout: Time server is marked unavailable after max_fails

Complete Example

upstream api_servers {
    least_conn;

    server 10.0.0.1:3000 weight=2 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:3000 weight=2 max_fails=3 fail_timeout=30s;
    server 10.0.0.3:3000 weight=1 max_fails=3 fail_timeout=30s;
    server 10.0.0.4:3000 backup;

    keepalive 32;
}

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://api_servers;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;

        proxy_next_upstream error timeout http_500 http_502 http_503;
        proxy_connect_timeout 5s;
        proxy_read_timeout 60s;
    }
}
intermediate Reverse Proxy Updated 2025-01-15
  • nginx
  • load balancing
  • upstream
  • round robin
  • health check