Як копіювати дані nginx на два сервери?


14

Я намагаюся копіювати трафік, який отримує один конкретний сервер nginx на два сервери. Мета - не завантажувати баланс, а відтворювати однаковий вхід на всіх nginx-серверах.

Приклад: Nginx отримує HTTP POST. Я хочу відправити цю саму POST на інші сервери.

** ОНОВЛЕННЯ **

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

КОРИСТУВАЧ -> ДАНІ ПОШТА


1
Чи можете ви розширити свою архітектуру? Які ще два сервери? Чи є спільний БД, спільна файлова система тощо? Чи пише POST в БД, у файлову систему, що? Насправді, що ви намагаєтеся зробити, що не можна зробити з кластерними файловими системами та екземплярами бази даних?
cjc

Я перефразував вам запитання, щоб більш точно відобразити те, що ви, здається, запитуєте.
gWaldo

1
Такий тип поведінки іноді використовується при тестуванні A / B
gWaldo


Я бачив подібний предмет, про який питали раніше. Я думаю, що те, що ви хочете переглянути, можна шукати як "перезавантаження http".
gWaldo

Відповіді:


10

Мені вдалося копіювати, використовуючи стан після запуску.

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 (директиви про течію та проксі) не дозволяє зробити це. Як зазначається в коментарях, це також порушує HTTP, оскільки немає чіткості щодо того, хто з двох задніх серверів відповість.

Одна з альтернатив - використовувати щось на кшталт лаку і робити повтор на другому задньому сервері за допомогою varnishreplay:

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

Я не використовував його, тому не знаю, чи можете ви змусити його відтворювати трафік майже одночасно з першим заднім сервером.


3

Що ви хочете використовувати, це щось на зразок EM-Proxy [1]. Він легко обробляє розділення http-запитів на будь-яку кількість серверів. Він також правильно обробляє повернення даних лише з живого сервера та блокує інші, щоб користувач не отримував декількох відповідей.

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


2

Використовуйте центральне сховище, як сервер NFS, і кожен веб-вузол nginx монтує загальну частину NFS (файл-рівень). Або використовуйте файлову систему кластера, як OCFS2, і кожен веб-вузол монтує LUN / розділ (рівень блоку).


Запит POST не обов'язково записує речі у файлову систему. Нам потрібні роз'яснення щодо архітектури ОП.
cjc

@cjc, Правда, я читав між рядків ...
HTTP500
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.