Я пытаюсь использовать nginx для балансировки нагрузки на пару подчиненных серверов приложений и для отображения страницы в стиле «отказавшего кита», если все подчиненные серверы отключены или не отвечают. К сожалению, в документации nginx сказано, что вы не можете использовать backup
директива в сочетании с ip_hash
директива в upstream
блок, поэтому я пытался придумать альтернативу.
Прямо сейчас соответствующие блоки в моей конфигурации:
upstream appservers {
ip_hash;
server srv1:8080;
server srv2:8080;
}
server {
listen 80;
location / {
proxy_pass http://appservers;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5s;
error_page 502 503 504 http://failwhale.myapp.com;
}
}
Проблема в том, что если я выключу оба сервера приложений, когда nginx вернет ошибку 502 (плохой шлюз), он просто будет использовать страницу ошибки 502 по умолчанию (простую белую) вместо перенаправления на http://failwhale.myapp.com (который также обслуживается nginx и определенно работает).
Кто-нибудь знает, что я делаю не так, и если это вообще должно работать, как я надеюсь? Если нет, что еще можно сделать?
Догадаться. Вам нужен proxy_next_upstream
объявить, чтобы отловить эти ошибки, а-ля:
location / {
proxy_pass http://appservers;
proxy_set_header X-Scheme $scheme;
proxy_connect_timeout 5s;
proxy_next_upstream error timeout http_502 http_503 http_504;
error_page 502 503 504 http://failwhale.myapp.com;
}