Я изучал несколько примеров файлов VCL для Varnish 3.x, и я уже несколько раз наталкивался на этот кусок, и это заставляло меня чесать в затылке:
sub vcl_recv {
...
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
...
}
В принципе, я не понимаю, какой смысл передавать неизвестные запросы серверной части? Это на всякий случай какое-то странное веб-приложение / протокол, чтобы он работал?
Почему лучше передать этот запрос по конвейеру, чем «передать» их?
Я был бы рад, если бы кто-нибудь объяснил, как использовать этот фрагмент.
В pass
Инструкция заставляет Varnish действовать как классический обратный прокси-сервер уровня 7, перенаправляя трафик, читая и воспроизводя каждый запрос один за другим.
В pipe
инструкция заставляет Varnish действовать как прокси HTTP CONNECTпобайтная потоковая передача трафика на внутренний сервер и обратно.
Если метод запроса неизвестен, Varnish может не знать, как интерпретировать и обрабатывать каждый запрос, и в этом случае вы можете вообще не трогать его, например, примеры VCL, которые вы видите.
WebSocket - отличный пример (из документов):
sub vcl_pipe {
if (req.http.upgrade) {
set bereq.http.upgrade = req.http.upgrade;
}
}
sub vcl_recv {
if (req.http.Upgrade ~ "(?i)websocket") {
return (pipe);
}
}
vcl_pipe
вызывается в начале передачи и гарантирует, что внутренний сервер получит HTTP Upgrade
заголовок и переключитесь на WebSocket, прежде чем продолжить.