Неправильный ответ nginx

У меня проблема с моим апстримом. Существует блок местоположения для веб-приложения, как показано ниже. Я делаю тест AB с этим.

location / {
   include backend.conf;
}

backend.conf

proxy_buffering on;
proxy_set_header RIP $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
set $session_id_included 'false';

if ($request_uri ~ ';jsessionid=') {
    set $session_id_included 'true';
}

if ($query_string ~ ';jsessionid=') {
    set $session_id_included 'true';
}

proxy_set_header SESSION_ID_INCLUDED $session_id_included;
proxy_pass_header  Set-Cookie;
proxy_intercept_errors on;
proxy_connect_timeout 30;
proxy_read_timeout 30;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404 ;


proxy_set_header Host 'example.com';;
proxy_pass http://backend;

Этот блок местоположения смотрит на это:

upstream backend {
  ip_hash;
  server backend_server_1 max_fails = 0 weight = 80; # old web application
  server backend_server_2 max_fails = 0 weight = 20; # new web application
}

На самом деле все работает. Однако 404 сообщения об ошибках поступают от backend_server_2, пока я подключаюсь к backend_server_1 с помощью ip_hash.

Как я могу получить 404 сообщения об ошибках от внутреннего сервера, на котором я вошел?

Если пользователь подключен к серверу backend_server_1 с помощью ip_hash, с сервера backend_server_1 должно поступить 404 ошибки.

Если пользователь подключен к серверу backend_server_2 с помощью ip_hash, с сервера backend_server_2 должно поступить 404 ошибки.

Спасибо

1 ответ

Решение

Если директива proxy_next_upstream содержит http_404затем ошибка 404, возвращенная одним вышестоящим сервером, заставит nginx передать этот запрос следующему вышестоящему серверу.

Удаление записи не по умолчанию http_404 заставит nginx обслуживать только 404 ответа сервера, к которому подключен пользователь.

Обратите внимание, что в этом случае max_fails Параметр не имеет большого значения, потому что (цитируя руководство модуля прокси nginx):

Директива также определяет то, что считается неудачной попыткой связи с сервером. [..] Случаи http_403 и http_404 никогда не считаются неудачными попытками.

Это означает, что вы можете использовать учет попыток через max_fails чтобы более изящно справиться с одной из сторон вашего AB-теста со сбоями. Если причиной отключения было беспокойство 404, пересмотрите это сейчас.

Другие вопросы по тегам