Varnish продолжает выдавать 503 Service Unavailable при попытке загрузить страницу, создание которой занимает больше времени на веб-сервере.
В varnishlog я вижу FetchError c http read error: 0
ошибка, хотя я не совсем понимаю, что это значит.
Я также пробовал увеличить таймауты бэкэнда:
backend default {
.host = "x.x.x.x";
.port = "80";
.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;
}
Бэкэнд - это сервер Apache.
Все остальные страницы работают нормально.
Любые идеи?
Сообщение об ошибке означает (ссылки на номера строк относятся к лаку 2.1.3):
При получении заголовка [bin / varnishd / cache_fetch.c: 399] либо:
а) произошло переполнение [bin / varnishd / cache_httpconn.c: 170]
или
б) произошла ошибка при вызове read () [bin / varnishd / cache_httpconn.c: 175]
Число в конце - это значение errno, поэтому, поскольку оно равно 0 (без ошибок), я бы предполагать этот вариант а) произошел с read()
не должен возвращать отрицательное число без установки errno.
Переполнение обнаруживается с помощью следующего кода [bin / varnishd / cache_httpconn.c: 167], возвращающего отрицательный результат:
i = (htc->ws->r - htc->rxbuf.e) - 1; /* space for NUL */
htc->ws
это struct ws
[bin / varnishd / cache.h: 126], который является «структурой рабочего пространства». Член r - это зарезервированная длина этого рабочего пространства. htc->rxbuf
относится к struct txt
[bin / varnishd / cache.h: 109], но нет комментария, описывающего, к чему относятся элементы (b и e). Возможно, начало и конец?
Я не знаю, как изменяются размеры рабочих пространств (или даже если они), но - и я действительно догадываюсь здесь - я бы предположил, что некоторые возможные причины проблемы:
Может быть полезно попытаться найти точку, в которой может возникнуть ошибка, путем поиска в пространстве:
и посмотрите, сможете ли вы достоверно воспроизвести проблему.
Вы можете обойти проблему, увеличив http_headers
вариант выполнения. (Если вы используете <2.1, я думаю, что это параметр времени компиляции или настройки)