Как реплицировать данные nginx на два сервера?

14

Я пытаюсь реплицировать трафик, который получает один конкретный сервер nginx, на два сервера. Цель состоит не в балансировке нагрузки, а в воспроизведении одинаковых входных данных на всех серверах nginx.

Пример: Nginx получает HTTP POST. Я хочу отправить этот же POST на другие серверы.

** ОБНОВИТЬ **

Ситуация простая и несложная. Мне просто нужно повторно отправить данные POST (или GET или любые данные запроса) на другой IP-адрес сервера (он также работает с экземпляром nginx). Только это.

ПОЛЬЗОВАТЕЛЬ -> POST DATA -> NGINX INSTANCE ---- REDIRECT ---> SERVER 1 И SERVER 2

Бернард Бэй
источник
1
Можете ли вы расширить свою архитектуру? Каковы два других сервера? Есть ли общая БД, общая файловая система и т. Д.? Записывает ли POST в БД, в файловую систему, что? На самом деле, что вы пытаетесь достичь, чего нельзя сделать с помощью кластерных файловых систем и экземпляров базы данных?
CJC
Я перефразировал ваш вопрос, чтобы более точно отразить то, что вы, похоже, спрашиваете.
gWaldo
1
Этот тип поведения иногда используется в A / B-тестировании
gWaldo
2
Это не тот путь, который вы используете, вы нарушаете HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Даниэль Прата Алмейда
Я видел такие вещи, о которых спрашивали раньше. Я думаю, что то, что вы хотите посмотреть, можно найти как «http replay».
gWaldo

Ответы:

10

Я был в состоянии копировать, используя состояние 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;
}

Теперь он отправляет данные двум серверам.

Если ваш апстрим не поддерживает fastcgi (произошло в моем случае), замените его на proxy_pass.

патроны
источник
4

Я не верю, что вы можете сделать это с помощью nginx; быстрое изучение соответствующих битов документации nginx (директивы upstream и proxy) не говорит о том, что вы можете это сделать. Как отмечено в комментариях, это также нарушает HTTP, так как нет ясности, какой из двух задних серверов будет отвечать.

Один из вариантов - использовать что-то вроде лака и выполнить воспроизведение на втором тыловом сервере, используя varnishreplay:

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

Я не использовал его, поэтому не знаю, сможете ли вы заставить его воспроизводить трафик почти одновременно с первым тыловым сервером.

CJC
источник
3

То, что вы хотите использовать, это что-то вроде EM-Proxy [1]. Он легко справляется с разделением http-запросов на любое количество серверов. Он также правильно обрабатывает возврат данных только с живого сервера и блокирует другие, чтобы пользователь не получил несколько ответов.

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

Крис Джонстон
источник
2

Используйте центральное хранилище, как сервер NFS, и каждый веб-узел nginx устанавливает общий ресурс NFS (на уровне файлов). Или используйте кластерную файловую систему, такую ​​как OCFS2, и каждый веб-узел монтирует LUN / раздел (на уровне блоков).

HTTP500
источник
Запрос POST не обязательно записывает данные в файловую систему. Нам нужно уточнить архитектуру ОП.
CJC
@cjc, правда, я читал между строк ...
HTTP500