Nginx: зеркалирование http потока

1 minute read

img

Область применения

Данный пример конфигурации использовался для решения реальной задачи, формулировка которой звучала так (схематично на рисунке выше):

“У нас имеется основной и тестовый сервер , необходимо клонировать входящий поток http запросов между двумя серверами так, чтобы ответ (response) приходил только от первого, но при этом оба сервера обрабатывали запрос (request)”.

Решение

Создадим конфигурацию в Nginx, которая будет принимать запросы на 8082 порту, зеркалирование будет проходить между двумя серверами:

  • 1.1.1.1 - Основной сервер (с обработкой)
  • 2.2.2.2 - Тестовый сервер (с обработкой, но без ответа на запрос)
server {
    listen 8082;

    location / {
        proxy_pass http://1.1.1.1:4500;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        mirror /mirror;
        mirror_request_body on;
    }

    location /mirror {
        internal;
        proxy_pass http://2.2.2.2:4500$request_uri;
        access_log off;
        error_log /dev/null crit;
    }
}

В качестве тестирования можно использовать подготовленный мной web-сервис с единственный endpoint: POST-запрос с маршрутом /api/info, ссылка на githib.

Быстро развернуть API-сервис на вашем ubuntu/debian сервере (пример для root-пользователя):

sudo bash -c "$(curl -sL https://raw.githubusercontent.com/meanother/hapi/main/init.sh)"

Управление сервисом:

systemctl start hapi
systemctl enable hapi
systemctl status hapi

Файл systemd: /etc/systemd/system/hapi.service

Проверка запроса к Nginx (заменить proxy_server на ваш адрес балансировщика):

curl -X POST -d '{"k": "v"}' http://proxy_server:8082/api/info 

Полезные материалы

Большое спасибо всем за внимание! Если вам интересны подобные рассуждения - подписывайтесь на мой канал  Telegram_logo artydev & Co.