У меня проблема с моим апстримом. Блок местоположения для веб-приложения показан ниже. Я делаю с этим тест 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 была причиной его отключения, подумайте об этом сейчас.