Мы используем nginx для балансировки нагрузки в нашем приложении. Мы обнаружили, что nginx переключается на другой вышестоящий сервер по истечении времени ожидания запроса (хорошо). Однако он делает это для запросов PUT и POST, которые могут вызвать нежелательные результаты (данные сохраняются дважды). Можно ли настроить nginx так, чтобы он повторял запросы GET только по таймауту? Или есть другой способ решить проблему?
Наша конфигурация следующая:
upstream mash {
ip_hash;
server 127.0.0.1:8081;
server 192.168.0.11:8081;
}
server {
...
location / {
proxy_pass http://mash/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Это поведение по умолчанию, начиная с версии 1.9.13
Чтобы изменить его вручную, вы можете использовать:
proxy_next_upstream error timeout non_idempotent;
Я знаю, что довольно поздно в игру, но для меня это лучший результат при поиске этой проблемы, поэтому я хотел поделиться своим решением.
Это использует если директива (с одним из немногих допустимые варианты использования) в сочетании с пользовательский обработчик ошибок:
upstream backend {
server backend1;
server backend2;
}
server {
server_name proxy;
location / {
error_page 598 = @retry;
error_page 599 = @no_retry;
if ($request_method = POST) {
return 599;
}
return 598;
}
location @retry {
proxy_pass http://backend;
}
location @no_retry {
proxy_pass http://backend;
proxy_next_upstream off;
}
}
Пожалуйста, смотрите здесь документ: proxy_next_upstream
Обратите внимание, что это непроверенная суть
использовать proxy_method
директива
Ссылаться на: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_method
У меня такая же проблема на моем сервере tomcat. Время ожидания прокси-сервера при длительном запросе. я решил свою проблему, используя proxy_read_timeout. при увеличении тайм-аута мой запрос никогда не выдавался и не возникало никаких проблем. время ожидания по умолчанию 60 с. ссылка
location / {
proxy_pass http://xxxxxxxxxx.com;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 800;
proxy_send_timeout 800;
proxy_read_timeout 240;
}