Я пытаюсь воспроизвести трафик что один конкретный сервер nginx получает на два сервера. Цель не в балансировке нагрузки, а в том, чтобы воспроизвести один и тот же ввод на всех серверах nginx.
Пример: Nginx получает HTTP-запрос POST. Я хочу отправить тот же POST на другие серверы.
** ОБНОВИТЬ **
Ситуация простая и несложная. Мне просто нужно повторно отправить данные POST (или GET, или любые данные запроса) на другой IP-адрес сервера (он также запускает экземпляр nginx). Просто это.
ПОЛЬЗОВАТЕЛЬ -> ДАННЫЕ ПУБЛИКАЦИИ -> ИНСТАНЦИЯ NGINX ---- ПОВТОРНЫЙ ---> СЕРВЕР 1 И СЕРВЕР 2
Я смог реплицировать, используя состояние 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.
Я не верю, что вы можете сделать это с помощью nginx самостоятельно; быстрое прочтение соответствующих частей документации nginx (директивы upstream и proxy) не предполагает, что вы можете это сделать. Как отмечено в комментариях, это также нарушает HTTP, поскольку нет ясности, какой из двух задних серверов ответит.
Одна альтернатива - использовать что-то вроде varnish и выполнить повтор на втором заднем сервере с помощью varnishreplay:
https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html
Я не использовал его, поэтому не знаю, сможете ли вы заставить его воспроизводить трафик почти одновременно с первым задним сервером.
Вы хотите использовать что-то вроде EM-Proxy [1]. Он легко обрабатывает разделение HTTP-запросов на любое количество серверов. Он также правильно обрабатывает возвращаемые данные только с живого сервера и блокирует остальные, чтобы пользователь не получал несколько ответов.
Используйте центральное хранилище, например сервер NFS, и каждый веб-узел nginx монтирует общий ресурс NFS (на уровне файлов). Или используйте файловую систему кластера, такую как OCFS2, и каждый веб-узел монтирует LUN / раздел (на уровне блоков).