Назад | Перейти на главную страницу

Как реализовать частичное зеркалирование в nginx?

Я хочу протестировать раннюю новую версию сервера, и для этого я хочу отразить часть реальных запросов, поступающих на рабочий сервер на моем тестовом сервере.

Модуль зеркала позволяет мне делать зеркало все трафик, но я не нашел, как выполнить частичное зеркалирование запросов, например, я хочу зеркалировать 30% трафика.

Это возможно? Если да, то как?

Если у вас два веб-сервера и вы хотите отправлять 30% запросов на сервер А и 70% запросов к серверу B вы можете поставить балансировщик нагрузки перед двумя веб-серверами. В любом случае вы должны поставить балансировщик нагрузки перед двумя веб-серверами, иначе весь трафик будет идти только на один или другой сервер.

Используя веса, вы можете указать, сколько трафика должно идти на первый или второй сервер. Ниже приведен простой пример:

http {
  upstream myapp1 {
    server srv1.example.com weight=3;
    server srv2.example.com weight=7;
  }
  server {
    listen 80;
    location / {
      proxy_pass http://myapp1;
    }
  }
}

РЕДАКТИРОВАТЬ: Поскольку оба сервера являются производственными, вы можете использовать mirror модуль на srv1.example.com отправить 30% трафика на ваш тестовый сервер. Согласен, это немного грязный прием, поэтому не стесняйтесь голосовать против, когда будут предложены лучшие решения.

РЕДАКТИРОВАТЬ 2: назначьте одинаковый IP-адрес обеим записям DNS A, если у вас только один сервер.

http {
  ...
  split_clients "${remote_addr}AAA" $mirror_allowed {
    30% 1;
    * "";
  }
}

server {
  ...
  location / {
    ...
    mirror /mirror;
  }

  location /mirror {
    internal;
    if ($mirror_allowed = "") { 
      return 200; 
    }
    proxy_pass https://some.mirror.endpoint$request_uri;
  }
}