nginx otomatis load balancing balancing

29

Saya menggunakan nginx dan NginxHttpUpstreamModule untuk loadbalancing. Konfigurasi saya sangat sederhana:

upstream lb {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

server {
    listen  89;
    server_name localhost;

    location / {
            proxy_pass      http://lb;
            proxy_redirect  off;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Tetapi dengan konfigurasi ini, ketika salah satu dari 2 server backend sedang down, nginx masih merutekan permintaan ke sana dan mengakibatkan separuh waktu habis :(

Apakah ada solusi untuk membuat nginx untuk secara otomatis merutekan permintaan ke server lain ketika mendeteksi server yang jatuh.

Terima kasih.

robinmag
sumber

Jawaban:

33

Saya pikir itu karena nginx tidak mendeteksi bahwa hulu turun karena berada di mesin yang sama.

Opsi yang Anda cari adalah: proxy_next_upstream dan proxy_connect_timeout .

Coba ini:

location / {
        proxy_pass              http://lb;
        proxy_redirect          off;
        proxy_next_upstream     error timeout invalid_header http_500;
        proxy_connect_timeout   2;
        proxy_set_header        Host            $host;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
}
Guillaume Filion
sumber
Saya mengalami masalah dengan pengaturan Apache / PHP yang tidak lengkap (file perpustakaan PEAR hilang) yang melemparkan kesalahan http 500. proxy_next_upstream baru saja dicoba lagi di komputer lain - yang mengembalikan OK.
Alister Bulman
5
Mengapa proxy_redirect tidak aktif?
Seun Osewa
2

Hei, silakan lihat wiki: http://wiki.nginx.org/NginxHttpUpstreamModule#server

Pada dasarnya jika kegagalan terdeteksi, backend akan ditandai sebagai turun selama x detik dan itu akan mencoba lagi. Jadi jika Anda terus melihat koneksi, mungkin nginx yang terus memeriksa apakah backend telah tersedia.

Akan tetapi, seharusnya mencoba entri berikutnya di blok hulu, jadi Anda seharusnya tidak benar-benar melihat bahwa tidak ada backend tersedia jika hanya satu yang turun.

Martin Fjordvald
sumber