Назад | Перейти на главную страницу

error_page, похоже, не работает с директивой nginx upstream

Я пытаюсь использовать 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;
}