Algoritma Load Balancing Nginx
Server
Algoritma Load Balancing Nginx

By Dr. Declan Morar Jr., Published on 5 months ago

Nginx mendukung beberapa algoritma load balancing lain yang bisa kamu terapkan untuk mendistribusikan lalu lintas ke backend server. Berikut beberapa opsi lainnya:

1. Least Connections (least_conn)

Algoritma ini mengirimkan permintaan ke server yang saat ini menangani jumlah koneksi paling sedikit. Sangat berguna jika beban kerja server bervariasi.

Konfigurasi:


upstream backend_servers {
    least_conn;
    server ip2 weight=1;
    server ip3 weight=1;
    server ip4 weight=1;
}

Kapan digunakan: Jika aplikasi kamu memiliki beban yang tidak merata pada setiap request.

2. IP Hashing (ip_hash)

Algoritma ini memastikan bahwa permintaan dari alamat IP yang sama selalu diteruskan ke server yang sama.

Konfigurasi:


upstream backend_servers {
    ip_hash;
    server ip2;
    server ip3;
    server ip4;
}

Kapan digunakan: Jika aplikasi kamu mengharuskan persistence session.

3. Weighted Load Balancing

Memberikan prioritas lebih pada server tertentu berdasarkan bobot yang ditetapkan.

Konfigurasi:


upstream backend_servers {
    server ip2 weight=3;
    server ip3 weight=1;
    server ip4 weight=1;
}

Kapan digunakan: Jika server kamu memiliki spesifikasi yang berbeda.

4. Least Time (least_time header or least_time last_byte)

Mengirimkan permintaan ke server yang memiliki waktu respon terendah.

Konfigurasi:


upstream backend_servers {
    least_time header;
    server ip2;
    server ip3;
    server ip4;
}

Kapan digunakan: Jika kamu ingin mendistribusikan lalu lintas ke server yang merespons paling cepat.

5. Random with Two Choices (random two)

Algoritma ini memilih dua server secara acak dan memilih server dengan jumlah koneksi lebih sedikit dari dua pilihan tersebut.

Konfigurasi:


upstream backend_servers {
    random two least_conn;
    server ip2;
    server ip3;
    server ip4;
}

Kapan digunakan: Untuk distribusi acak yang lebih efisien.

6. Konfigurasi Rate Limiting

Untuk mengatur batas permintaan dari klien ke server, kita dapat menggunakan konfigurasi berikut:


limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

Penjelasan:

  • $binary_remote_addr: Parameter ini mendefinisikan alamat IP dari client yang digunakan untuk rate limiting.
  • 10r/s: Membatasi setiap client untuk hanya dapat mengirim maksimal 10 permintaan per detik.

Untuk menerapkan batas permintaan ini, kita dapat menggunakan konfigurasi:


limit_req zone=one burst=20 nodelay;

Penjelasan:

  • burst=20: Mengizinkan burst (ledakan permintaan) hingga 20 permintaan sekaligus sebelum rate limiting diterapkan.
  • nodelay: Permintaan akan diblokir jika sudah melewati batas tanpa ditunda (ditolak langsung).

7. Configuration


    http {
        limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

        upstream backend_round_robin {
            server ip2;
            server ip3;
            server ip4;
        }

        upstream backend_least_conn {
            least_conn;
            server ip2;
            server ip3;
            server ip4;
        }

        upstream backend_ip_hash {
            ip_hash;
            server ip2;
            server ip3;
            server ip4;
        }

        upstream backend_weighted {
            server ip2 weight=3;
            server ip3 weight=1;
            server ip4 weight=1;
        }

        upstream backend_least_time {
            least_time header;
            server ip2;
            server ip3;
            server ip4;
        }

        upstream backend_random_two {
            random two least_conn;
            server ip2;
            server ip3;
            server ip4;
        }

        server {
            listen 80 default_server;
            listen [::]:80 default_server;
            server_name _;

            # Redirect all HTTP traffic to HTTPS
            return 301 https://$host$request_uri;
        }

        server {
            listen 443 ssl;
            server_name _;

            ssl_certificate /etc/nginx/ssl/cert.pem;
            ssl_certificate_key /etc/nginx/ssl/private.key;
            ssl_client_certificate /etc/nginx/ssl/certificate.crt;

            access_log /home/load_balancer_access.log;
            error_log /home/load_balancer_error.log;

            location /round-robin {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_round_robin;
                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;
            }

            location /least-conn {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_least_conn;
                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;
            }

            location /ip-hash {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_ip_hash;
                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;
            }

            location /weighted {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_weighted;
                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;
            }

            location /least-time {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_least_time;
                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;
            }

            location /random-two {
                limit_req zone=one burst=20 nodelay;
                proxy_pass http://backend_random_two;
                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;
            }
        }
    }