Nginx verileri iki sunucuya nasıl çoğaltılır?


14

Belirli bir nginx sunucusunun iki sunucuya aldığı trafiği çoğaltmaya çalışıyorum . Amaç yük dengelemek değil, aynı girişi tüm nginx sunucularında tekrar oynatmaktır.

Örnek: Nginx bir HTTP POST alır. Aynı POST'u diğer sunuculara göndermek istiyorum.

** GÜNCELLEME **

Durum kolay ve karmaşık değildir. Sadece POST verileri (veya GET veya herhangi bir istek verileri) başka bir sunucu IP'ye (ayrıca bir nginx örneği çalıştıran) yeniden göndermeniz gerekir. Sadece bu.

KULLANICI -> POST VERİLERİ -> NGINX INSTANCE ---- REIRECT ---> SUNUCU 1 VE SUNUCU 2


1
Mimarinizi genişletebilir misiniz? Diğer iki sunucu nedir? Paylaşılan bir DB, paylaşılan dosya sistemi vb. Var mı? POST DB'ye, dosya sistemine ne yazıyor? Aslında, kümelenmiş dosya sistemleri ve veritabanı örnekleri ile yapılamayan ne yapmaya çalışıyorsunuz?
cjc

Sormak istediğinizi daha doğru bir şekilde yansıtmak için sorunuzu yeniden ifade ettim.
gWaldo

1
Bu tür davranışlar bazen A / B testinde kullanılır
gWaldo

2
Bu yol değil, HTTP'yi kırıyorsunuz
Daniel Prata Almeida

Daha önce sorulan bu tür şeyleri gördüm. Ben bakmak istediğiniz şey "http tekrar" olarak aranabilir düşünüyorum.
gWaldo

Yanıtlar:


10

Post_action durumunu kullanarak çoğaltmayı başardım.

upstream main_upstream {
least_conn;
server 192.168.9.10:80;
keepalive 1024;
}

server {
listen 80;
server_name _;
client_body_buffer_size 1512k;
client_max_body_size 10m;

location /1/ {
fastcgi_pass main_upstream;
post_action @replayevent ;

}
# Send the post_action request to a FastCGI backend for logging.
location @replayevent {
fastcgi_pass 192.168.9.14:80;
}

Şimdi iki sunucu veri gönderiyor.

Yukarı akışınız fastcgi'yi desteklemiyorsa (benim durumumda oldu), proxy_pass ile değiştirin.


4

Bunu kendi başına nginx ile yapabileceğinize inanmıyorum; nginx belgelerinin (yukarı akış ve proxy direktifleri) ilgili bitlerinin hızlı bir şekilde incelenmesi, yapabileceğinizi göstermez. Yorumlarda belirtildiği gibi, iki arka sunucudan hangisinin yanıt vereceği konusunda netlik olmadığından, bu HTTP'yi de kırıyor.

Bir alternatif, vernik gibi bir şey kullanmak ve vernik görüntüsünü kullanarak ikinci arka sunucuya bir tekrar yapmaktır:

https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html

Kullanmadım, bu yüzden trafiği ilk arka sunucu ile neredeyse aynı anda tekrar oynatıp tekrarlayamayacağınızı bilmiyorum.


3

Kullanmak istediğiniz şey EM-Proxy [1] gibidir. İstenilen sayıda sunucuya http isteklerini bölmeyi kolayca yapar. Ayrıca, yalnızca canlı sunucudan veri döndürmeyi ve diğerlerini engellemeyi doğru şekilde işler, böylece kullanıcı birden fazla yanıt almaz.

[1] https://github.com/igrigorik/em-proxy/


2

NFS sunucusu gibi merkezi depolamayı kullanın ve her nginx web düğümü NFS paylaşımını (dosya düzeyi) bağlar. Veya OCFS2 gibi bir küme dosya sistemi kullanın ve her web düğümü LUN / bölümü (blok düzeyi) bağlar.


POST isteği mutlaka dosya sistemine bir şeyler yazmaz. OP'nin mimarisi hakkında açıklığa ihtiyacımız var.
cjc

@cjc, Doğru, satırlar arasında okuyordum ...
HTTP500
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.