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

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

У меня проблема с моим апстримом. Блок местоположения для веб-приложения показан ниже. Я делаю с этим тест A-B.

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
}

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

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

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

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

Спасибо

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

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

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

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

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