Çok sayıda arka uç sunucusu içeren nginx'i ters proxy olarak kurmaya çalışıyorum. Talep üzerine (gelen ilk talepte) talep üzerine arka uç başlatmak istiyorum, bu yüzden aldığı talebe bağlı olarak arka uçta başlayan bir kontrol sürecim (HTTP istekleriyle kontrol ediliyor) var.
Benim sorunum bunu yapmak için nginx'i yapılandırmak. İşte şimdiye kadar sahip olduğum şey:
server {
listen 80;
server_name $DOMAINS;
location / {
# redirect to named location
#error_page 418 = @backend;
#return 418; # doesn't work - error_page doesn't work after redirect
try_files /nonexisting-file @backend;
}
location @backend {
proxy_pass http://$BACKEND-IP;
error_page 502 @handle_502; # Backend server down? Try to start it
}
location @handle_502 { # What to do when the backend server is not up
# Ping our control server to start the backend
proxy_pass http://127.0.0.1:82;
# Look at the status codes returned from control server
proxy_intercept_errors on;
# Fallback to error page if control server is down
error_page 502 /fatal_error.html;
# Fallback to error page if control server ran into an error
error_page 503 /fatal_error.html;
# Control server started backend successfully, retry the backend
# Let's use HTTP 451 to communicate a successful backend startup
error_page 451 @backend;
}
location = /fatal_error.html {
# Error page shown when control server is down too
root /home/nginx/www;
internal;
}
}
Bu işe yaramaz - nginx, kontrol sunucusundan döndürülen durum kodlarını görmezden gelir. Lokasyondaki error_page
direktiflerin hiçbiri @handle_502
çalışmıyor ve 451 kodu müşteriye olduğu gibi gönderiliyor.
Bunun için dahili nginx yönlendirmesini kullanmaktan vazgeçtim ve kontrol sunucusunu aynı yere 307 yönlendirmesi verecek şekilde değiştirmeye çalıştım (böylece müşteri aynı isteği tekrar deneyecek, ama şimdi arka uç sunucusu başladı). Ancak, nginx, kontrol sunucusunun bir "Konum" başlığı göndermesine rağmen, arka uç isteği girişimi (502) 'den gelen durum kodunun aptalca üzerine yazmaktadır. Sonunda error_page satırını değiştirerek "çalışıyor" oldumerror_page 502 =307 @handle_502;
Böylece tüm kontrol sunucusu cevaplarını istemciye 307 koduyla geri gönderilmeye zorlamak. Bu çok tehlikeli ve istenmeyen bir durumdur, çünkü 1) kontrol sunucusunun cevabına bağlı olarak nginx'in sonra ne yapması gerektiğine dair bir kontrol yoktur (ideal olarak sadece kontrol sunucusu başarı rapor ederse arka ucu yeniden denemek isteriz) ve 2) tüm HTTP değil istemciler HTTP yönlendirmelerini destekler (örneğin, curl kullanıcıları ve libcurl kullanan uygulamalar açıkça yönlendirmeleri takip etmelidir).
Nginx'in yukarı akış sunucusuna A, sonra B, sonra tekrar A'ya proxy kullanmaya çalışmasının doğru yolu nedir (ideal olarak, yalnızca B belirli bir durum kodu döndürdüğünde)?
proxy_next_upstream
hile yaptım (senaryo benimki kadar karmaşık değildi), bir hata oluştuğunda nginx'in bir sonraki sunucuyu denemesini istedim, bu yüzden eklemek zorunda kaldımproxy_next_upstream error timeout invalid_header non_idempotent;
(non_idempotent
çünküPOST
istekleri iletmek istiyorum ).