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

Скопируйте и доставьте запрос на другой сервер nginx для тестирования реального трафика

У меня есть веб-служба Flask, которая работает на uwsgi + nginx, и она хорошо работает.

У меня есть другая разрабатываемая версия службы, работающая на другом сервере. Он также работает на uwsgi + nginx.

Что я хочу сделать, так это протестировать сервер разработки с «реальным» трафиком (запросы POST). Я проверил, что сервер разработки в основном работает хорошо. Просто хочу сравнить эти два с одинаковым реальным трафиком.

Моя основная идея выглядит так:

(A) старый сервер (B) тестовый сервер

  1. Запросы пользователей

  2. Nginx (A) получает запрос и доставляет его в uwsgi (A) для обработки.

  3. Nginx (A) «копирует» запрос и доставляет его в Nginx (B) для тестирования.

  4. uwsgi (A) обрабатывает запрос в приложении Flask (A) и ответ пользователю (через Nginx (A))

  5. Nginx (B) обрабатывает запрос, как устаревший сервер, но не отвечает пользователю (просто ведет журнал)

Есть ли в этом смысл? Какой подход я должен выбрать?

Я сам нашел решение. Итак, я делюсь своим выводом здесь.

я использовал post_action директива для этого.

location / {
    uwsgi_pass      unix:app.sock;
    post_action @post_action; 
}

location @post_action {
    proxy_pass      http://dst_host:dst_port; 
}

Сначала запрос доставляется в unix: app.sock, а когда он завершается, директива post_action передает запрос в указанное место, @post_action.

Работает как часы!

location / {
      proxy_pass  http://y.y.y.y:port;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_connect_timeout      300;
      proxy_send_timeout         300;
      proxy_read_timeout         300;
      post_action @post_action;
    }

location @post_action {
    proxy_pass      http://x.x.x.x:port;
    access_log /var/log/nginx/c.log application;
    error_log /var/log/nginx/c.log error;
}

Запрос сначала доставлен http: //y.y.y.y: порт и когда он завершится, post_action не сможет передать запрос в указанное место, @ post_action. Есть ли что-то еще, что нам нужно сделать?