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

Varnish 503 при выводе медленной страницы

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). Возможно, начало и конец?

Я не знаю, как изменяются размеры рабочих пространств (или даже если они), но - и я действительно догадываюсь здесь - я бы предположил, что некоторые возможные причины проблемы:

  • Очень большое количество заголовков
  • Очень длинные заголовки
  • Ошибка в том, как Varnish изменяет размер рабочих пространств (если это так)

Может быть полезно попытаться найти точку, в которой может возникнуть ошибка, путем поиска в пространстве:

  • Длина заголовка
  • Номера заголовков

и посмотрите, сможете ли вы достоверно воспроизвести проблему.

Вы можете обойти проблему, увеличив http_headers вариант выполнения. (Если вы используете <2.1, я думаю, что это параметр времени компиляции или настройки)