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

Varnish saintmode дает 503 вместо пользовательских 500 страниц бэкэнда

Я не понимаю поведения Varnish в этом случае:

Скажем, у меня есть одна страница на сайте, которая начинает генерировать 500 ошибок (и на сайте есть хороший настраиваемый экран 500, но это не совсем актуально).

У меня есть код в подпрограмме vcl_fetch:

sub vcl_fetch {
    // Keep stale response for six hours in case backend fails.
    set beresp.grace = 6h;
    if (beresp.status == 500) {
        set beresp.saintmode = 30s;
        return(restart);
    }

Я надеялся, что в случае возникновения ошибки 500 Varnish доставит кешированную версию страницы с увеличенным льготным периодом. Это не то, что случилось.

Вместо этого Varnish публикует свою 500-ю страницу, а затем начинает размещать 503-ю.

Если я изменю возврат на (доставить), то он доставляет пользовательскую страницу 500 из бэкенда, но затем обслуживает свои собственные 503 страницы для медитации гуру на время действия режима святого.

Что я хотеть Очевидно, что произойдет это, чтобы доставить кешированную версию до начала 500, за исключением этого, отправить нашу пользовательскую страницу 500 и никогда не отправлять 503.

В этом случае серверные ВМ по-прежнему сообщают о работоспособности, а другие страницы сайта все еще обслуживаются.

Вам нужно посмотреть на реализацию режима Grace и / или Saint.

https://www.varnish-cache.org/docs/trunk/users-guide/vcl-saint-and-grace.html

Режим Grace позволяет вам обслуживать устаревший контент, когда ваши серверные ВМ не работают или работают медленно, а режим святого позволяет вам повторить попытку другого бэкэнда, если бэкэнд, который вы использовали, выдает ошибку.

Таким образом, для использования режима святого вам потребуется 2 или более серверных ВМ.

Чтобы использовать льготный режим, вам понадобится какой-то способ вернуть настраиваемую страницу с ошибкой, даже если бэкэнд не работает. Либо из статического файла html, либо из кода HTML, встроенного в vcl. И то, и другое должно быть всегда, даже когда серверная часть не работает.