Nginx'i tek bir yukarı akış sunucusunu yeniden deneyecek şekilde yapılandırma


14

Ters proxy olarak nginx kullanıyorum ve akış yukarı sunucu yanıt vermiyorsa, birkaç saniye bekleyin ve bir isteği yeniden denemek istiyorum. Bu şekilde yukarı akış sunucumu yeniden başlatabilirim ve 502 hatalı ağ geçidi gören kullanıcılar yerine, tarayıcıları sadece birkaç saniye kilitlenir (yeniden başlatma işlemi 3 veya 4 saniye sürer). Birkaç şey denedim, bunu sunucu bloğuma koydum:

proxy_connect_timeout 60;
proxy_send_timeout 15;
proxy_read_timeout 20;

ama hiçbir şey yapmıyor gibiydi. Ayrıca yukarı akış bloğuna eklemeyi denedim:

server 127.0.0.1:3001 fail_timeout=10s;

yine, istediğim gibi değil.

Mümkün mü? Neyi kaçırıyorum?

Yanıtlar:


1

Denediğiniz direktifler, istediğinizden farklı şeyler içindir. Belgelerini okuyun.

upstreamBir memba blok nasıl çalıştığını direktif belgeleri iyice açıklıyor:

Bir sunucuyla iletişim sırasında bir hata oluşursa, istek bir sonraki sunucuya geçirilir ve çalışan tüm sunucular denenene kadar devam eder. Sunucuların hiçbirinden başarılı bir yanıt alınamazsa, istemci son sunucuyla iletişimin sonucunu alır.

Her şey orada dedi.

Bununla birlikte, döndürülen hata kodunu arka uçtan ele geçirerek işleyebilir proxy_intercept_errorsve ardından $request_uriorijinal istemci adına onunla ilgilenen özel bir komut dosyasına gönderebilirsiniz .

Temel: istemci tarafını (veya ön taraf tarafını) yeniden denemek için bazı kod / uygulama mantığına ihtiyacınız vardır.


0

Başka bir cevapta belirtildiği gibi, nginx'in bunu yapmasının yerleşik bir yolu yoktur. Olası bir çözüm, mevcut sunucunuzdan oluşan bir yük dengeleme kurulumu ve tüm istekler için aşağıdakileri yapan bir yedekleme sunucusu kullanmaktır:

  • yeniden çevrimiçi oluncaya kadar mevcut sunucunuzu yoklayın
  • ardından 302 veya başka bir yönlendirmeyle yanıt verin, böylece tarayıcı tekrar dener

Bu sunucu 'yedekleme' bayrağıyla işaretlenir, böylece yalnızca diğer tüm sunucular çevrimdışıyken denenir ( HTTP Yük Dengeleme> Sunucu Ağırlıkları ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.