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

Может кто-нибудь объяснить этот фрагмент VCL sub_recv на Varnish 3.x?

Я изучал несколько примеров файлов 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, прежде чем продолжить.