Come replicare i dati nginx su due server?


14

Sto cercando di replicare il traffico che uno specifico server nginx riceve su due server. L'obiettivo non è bilanciare il carico, ma riprodurre lo stesso input su tutti i server nginx.

Un esempio: Nginx riceve un POST HTTP. Voglio inviare lo stesso POST ad altri server.

** AGGIORNARE **

La situazione è semplice e non complessa. Ho solo bisogno di inviare nuovamente i dati POST (o GET o qualsiasi dato di richiesta) a un altro IP del server (che esegue anche un'istanza nginx). Proprio così

UTENTE -> DATI POST -> ISTANZA NGINX ---- REDIRECT ---> SERVER 1 E SERVER 2


1
Puoi espandere la tua architettura? Quali sono gli altri due server? Esiste un DB condiviso, un filesystem condiviso, ecc.? Il POST scrive nel DB, nel filesystem, cosa? In realtà, cosa stai cercando di realizzare che non può essere fatto con filesystem in cluster e istanze di database?
cjc

Ho riformulato la tua domanda per riflettere più accuratamente ciò che sembra stia chiedendo.
gWaldo

1
Questo tipo di comportamento viene talvolta utilizzato nei test A / B
gWaldo

2
Non è questa la strada da percorrere, stai rompendo HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Daniel Prata Almeida,

Ho già visto questo tipo di cose di cui mi sono chiesto prima. Penso che ciò che si desidera esaminare possa essere cercato come "replay http".
gWaldo

Risposte:


10

Sono stato in grado di replicare utilizzando lo stato post_action.

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;
}

Ora invia dati due server.

Se il tuo upstream non supporta fastcgi (è successo nel mio caso), sostituiscilo con proxy_pass.


4

Non credo che tu possa farlo con nginx da solo; una rapida lettura dei bit rilevanti della documentazione di nginx (direttive upstream e proxy) non suggerisce che tu possa farlo. Come notato nei commenti, anche questo interrompe l'HTTP, poiché non vi è chiarezza su quale dei due server posteriori risponderà.

Un'alternativa è usare qualcosa come vernice e fare un replay sul secondo server posteriore usando varnishreplay:

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

Non l'ho usato, quindi non so se è possibile farlo riprodurre il traffico quasi contemporaneamente con il primo server posteriore.


3

Quello che vuoi usare è qualcosa come EM-Proxy [1]. Gestisce facilmente la suddivisione delle richieste http su qualsiasi numero di server. Gestisce correttamente anche la restituzione dei dati solo dal server live e il blocco degli altri in modo che l'utente non ottenga più risposte.

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


2

Utilizzare l'archiviazione centrale come un server NFS e ciascun nodo Web nginx monta la condivisione NFS (a livello di file). Oppure utilizzare un file system del cluster come OCFS2 e ciascun nodo Web monta la LUN / partizione (a livello di blocco).


La richiesta POST non necessariamente scrive cose sul filesystem. Abbiamo bisogno di chiarimenti sull'architettura del PO.
cjc

@cjc, vero, stavo leggendo tra le righe ...
HTTP500
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.