Неправильный ответ 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, пересмотрите это сейчас.