Я работаю над запуском нескольких приложений Rails через Varnish, чтобы обеспечить лучшую поддержку кеширования, которая, надеюсь, будет более гибкой, чем встроенные параметры кеширования страниц в rails.
Одна проблема, на которую я наткнулся, заключается в том, что, когда сервер приложений возвращает ошибку HTTP / 50x, лак не обслуживает страницу настраиваемой ошибки (например, когда приложение rails вызывает исключение, мы визуализируем настраиваемый шаблон HTML ошибки) - вместо того, чтобы видеть На «красивой» удобной для пользователя странице ошибки мы видим следующий текст:
Error 503 Service Unavailable
Service Unavailable
Guru Meditation:
XID: 828451354
Varnish cache server
Есть ли способ передать полученный HTML-код с внутреннего сервера клиенту? Это так же просто, как реализовать метод VCL sub_error и использовать директиву fetch или pass?
Спасибо.
Что ж, у меня есть ответ - и, что удивительно, проблема даже не в том, что лак не передает содержимое ответа HTTP / 500.
Ошибка HTTP / 503 на самом деле возникала, когда Varnish истекал по таймауту при подключении к внутреннему серверу или ожидал отправки байтов.
В основном, если соединение с серверной частью было успешным, но серверная часть не отправляет первый байт без определенного периода тайм-аута или есть задержка между отправкой байтов, Varnish будет тайм-аут и вернет ошибку HTTP / 503.
Решение состоит в том, чтобы обновить значения тайм-аута (и, конечно же, исправить медленный внутренний сервер), как показано ниже (как подробно описано в: http://varnish-cache.org/wiki/VCL):
backend www {
.host = "www.example.com";
.port = "http";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
}