Я обновляю старый сервер Varnish 3 до Varnish 6.11
Этот сервер Varnish был настроен таким образом, чтобы избежать кэширования больших файлов (более 100 МБ) с использованием pipe
. Сначала запрос был нормально отправлен на бэкэнд, и, если размер заголовка Content-Length
ответа был больше 100 МБ, запрос был повторен: vcl_recv
был вызван внутренне второй раз с новым заголовком x-pipe
для запроса, указывающимvlc_recv
до pipe
вместо hash
. Это был способ сделать это тогда:
добавлено в vcl_recv:
/* Bypass cache for large files. The x-pipe header is
set in vcl_fetch when a too large file is detected. */
if (req.http.x-pipe && req.restarts > 0) {
remove req.http.x-pipe;
return (pipe);
}
добавлено в vcl_fetch:
# don't cache files larger than 10MB
/* Don't try to cache too large files. It appears
Varnish just crashes if we don't filter them. */
if (beresp.http.Content-Length ~ "[0-9]{8,}" ) {
set req.http.x-pipe = "1";
return (restart);
}
Теперь, когда vcl_fetch
было изменено наvcl_backend_response
, действие restart
исчезло. Замена retry
на restart
не приводит к тому же поведению, что и функция vcl_recv
не вызывается во второй раз. retry
только повторяет внутренний запрос.
Возврат pass
в vcl_backend_response
страдает по той же причине pipe
: Varnish должен будет прочитать запрос в память перед отправкой клиенту иэто то, чего pipe
избегали.
Мой вопрос: как pipe
(отправлять байты непосредственно из серверной части клиенту без какой-либо обработки) в большие файлы с помощью VCL 4.0?