Добрый день,
Имеем секцию апстрим из N серверов:
upstream foo {
server a;
server b;
...
}
Для того, чтобы клиент ни в коем случае не заметил задержек с ответом, мы возвращаем предопредленный ответ в случае задержки на сервере:
location = /foo {
fastcgi_pass
fastcgi_keep_conn on;
include fastcgi-params.conf;
fastcgi_read_timeout 75ms;
fastcgi_intercept_errors on;
error_page 500 501 502 503 504 = /foo_failover;
}
location = /foo_failover {
root /var/www;
}
Проблема в том, что при задержке с ответом с одного из серверов nginx перекидывает запрос на другой сервер в апстриме, потом возможно на третий, видимо ожидая на каждом из серверов не дольше заданных 75 мс, но в сумме набирается недопустимо длительное время, так как в процессе таких ожиданий и перекидываний на клиенте срабатывает уже свой таймаут, чего как раз хочется избежать.
Есть ли более элегантный способ сохранить балансировку нагрузки, но запретить перенаправление, кроме как заводить N апстримов, каждый из одного сервера, прописывать им отдельно fastcgi_read_timeout и error_page, а из локейшена /foo, скажем, проксировать запрос на эти локейшены?
Спасибо!