Bagaimana cara mereplikasi data nginx ke dua server?

14

Saya mencoba mereplikasi traffic yang diterima oleh satu server nginx spesifik ke dua server. Tujuannya bukan untuk memuat-keseimbangan, tetapi untuk memutar ulang input yang sama pada semua server nginx.

Contoh: Nginx menerima HTTP POST. Saya ingin mengirim POST yang sama ke server lain.

** PEMBARUAN **

Situasinya mudah dan tidak rumit. Saya hanya perlu mengirim ulang data POST (atau MENDAPATKAN atau data permintaan) ke IP server lain (juga menjalankan instance nginx). Hanya itu.

PENGGUNA -> POST DATA -> NGINX INSTANCE ---- REDIRECT ---> SERVER 1 AND SERVER 2

Bernard Bay
sumber
1
Bisakah Anda memperluas arsitektur Anda? Apa dua server lainnya? Apakah ada DB bersama, sistem file bersama, dll? Apakah POST menulis ke DB, ke sistem file, apa? Sebenarnya, apa yang ingin Anda capai yang tidak dapat dilakukan dengan sistem file berkerumun dan contoh database?
cjc
Saya ulangi pertanyaan Anda untuk mencerminkan dengan lebih akurat apa yang tampaknya Anda tanyakan.
gWaldo
1
Jenis perilaku ini kadang-kadang digunakan dalam pengujian A / B
gWaldo
2
Itu bukan cara untuk pergi, Anda melanggar HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Daniel Prata Almeida
Saya pernah melihat hal seperti ini ditanyakan sebelumnya. Saya pikir apa yang ingin Anda lihat bisa dicari sebagai "replay http".
gWaldo

Jawaban:

10

Saya dapat mereplikasi menggunakan status 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;
}

Sekarang mengirim data dua server.

Jika upstream Anda tidak mendukung fastcgi (terjadi dalam kasus saya), ganti dengan proxy_pass.

Chucks
sumber
4

Saya tidak percaya Anda bisa melakukan ini dengan nginx dengan sendirinya; membaca cepat bit yang relevan dari dokumentasi nginx (arahan hulu dan proksi) tidak menyarankan Anda bisa. Seperti disebutkan dalam komentar, ini juga memecah HTTP, karena tidak ada kejelasan yang mana dari dua server belakang akan merespons.

Salah satu alternatif adalah menggunakan sesuatu seperti pernis dan melakukan replay ke server belakang kedua menggunakan varnishreplay:

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

Saya belum menggunakannya, jadi saya tidak tahu apakah Anda dapat membuatnya memutar ulang lalu lintas hampir bersamaan dengan server belakang pertama.

cjc
sumber
3

Yang ingin Anda gunakan adalah sesuatu seperti EM-Proxy [1]. Ini dengan mudah menangani pemisahan permintaan http di sejumlah server. Itu juga dengan benar menangani mengembalikan data hanya dari server langsung dan memblokir yang lain sehingga pengguna tidak mendapatkan beberapa respons.

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

Chris Johnston
sumber
2

Gunakan penyimpanan pusat seperti server NFS dan setiap node web nginx memasang share NFS (tingkat file). Atau gunakan sistem file cluster seperti OCFS2 dan setiap node web memasang LUN / partisi (tingkat blok).

HTTP500
sumber
Permintaan POST tidak harus menulis sesuatu ke sistem file. Kami membutuhkan klarifikasi tentang arsitektur OP.
cjc
@ cjc, Benar, saya membaca yang tersirat ...
HTTP500