Mengkonfigurasi nginx untuk mencoba kembali satu server hulu

14

Saya menggunakan nginx sebagai proxy terbalik dan saya ingin menunggu beberapa detik dan coba lagi permintaan jika server upstream tidak merespons. Dengan cara ini saya dapat me-restart server upstream saya dan bukannya pengguna melihat 502 gateway buruk, browser mereka hanya bertahan selama beberapa detik (proses restart memakan waktu 3 atau 4 detik). Saya sudah mencoba beberapa hal, saya meletakkan ini di blok server saya:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

tapi sepertinya tidak melakukan apa-apa. Saya juga mencoba menambahkan ini ke blok hulu:

server 127.0.0.1:3001 fail_timeout=10s;

lagi, bukan yang saya inginkan.

Apakah ini mungkin? Apa yang saya lewatkan?

John
sumber

Jawaban:

1

Arahan yang Anda coba dimaksudkan untuk hal yang berbeda dari yang Anda inginkan. Baca dokumentasi mereka.

The upstreamdokumentasi direktif menjelaskan secara menyeluruh bagaimana blok hulu bekerja:

Jika terjadi kesalahan selama komunikasi dengan server, permintaan akan diteruskan ke server berikutnya, dan seterusnya hingga semua server yang berfungsi akan dicoba. Jika respons yang berhasil tidak dapat diperoleh dari server mana pun, klien akan menerima hasil komunikasi dengan server terakhir.

Semuanya dikatakan di sana.

Namun Anda mungkin dapat memproses kode kesalahan yang dikembalikan dari backend dengan mencegatnya dengan proxy_intercept_errorsdan kemudian mengirimnya $request_urike skrip khusus yang menanganinya atas nama klien asli.

Garis dasarnya adalah: Anda memerlukan logika kode / aplikasi untuk mencoba kembali sisi klien (atau sisi depan).

Bernard Rosset
sumber
0

Seperti yang dinyatakan dalam jawaban lain, tidak ada cara bawaan untuk membuat nginx melakukan ini. Solusi yang mungkin adalah dengan menggunakan pengaturan penyeimbangan beban yang terdiri dari server Anda saat ini, dan server cadangan yang melakukan hal berikut untuk semua permintaan:

  • polling server Anda saat ini sampai kembali online
  • kemudian balas dengan 302 atau pengalihan lainnya sehingga browser mencoba lagi

Server ini akan ditandai dengan bendera 'cadangan' sehingga hanya akan dicoba ketika semua server lain sedang luring ( HTTP Load Balancing> Server Weights ).

pengguna987356
sumber