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

Varnish 3.0 Guru Meditation с ошибкой FetchError TestGunzip в самом конце

Я получаю периодические медитации гуру в лаке (например, я отправляю 50 запросов и 3 возвращаются неудачно). В журнале varnishlog написано

   15 VCL_return   c hash
   15 HitPass      c 1394372109
   15 VCL_call     c pass pass
   15 Backend      c 17 default default
   15 TTL          c 1394372164 RFC 0 -1 -1 1384590297 0 1384590291 0 0
   15 VCL_call     c fetch
   15 TTL          c 1394372164 VCL 120 -1 -1 1384590297 -0
   15 VCL_return   c hit_for_pass
   15 ObjProtocol  c HTTP/1.1
   15 ObjResponse  c OK
   15 ObjHeader    c Date: Sat, 16 Nov 2013 08:24:51 GMT
   15 ObjHeader    c Server: Apache
   15 ObjHeader    c Accept-Ranges: bytes
   15 ObjHeader    c Cache-Control: max-age=0, no-cache
   15 ObjHeader    c Vary: Accept-Encoding
   15 ObjHeader    c X-Mod-Pagespeed: 1.5.27.2-2912
   15 ObjHeader    c Content-Encoding: gzip
   15 ObjHeader    c Content-Type: text/html; charset=utf-8
   15 Gzip         c u F - 3755 13624 80 0 0
   15 FetchError   c TestGunzip error at the very end
   15 VCL_call     c error deliver
   15 VCL_call     c deliver deliver
   15 TxProtocol   c HTTP/1.1
   15 TxStatus     c 503
   15 TxResponse   c Service Unavailable

Вы можете увидеть 15 FetchError c TestGunzip error at the very end в чем проблема. Я не уверен, как интерпретировать строку выше Gzip c u F - 3755 13624 80 0 0 и я не понимаю, почему это проблема. На сайте не было сообщений о проблемах с загрузкой страниц, пока мы не покрыли их лаком.

Предполагая, что varnish просто более строг в отношении gzip, чем браузеры, я попытался отключить обработку gzip, поэтому я установил http_gzip_support уйти в /etc/defaults/varnish:

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m \
             -p http_gzip_support=off"

Это не имело никакого значения. У меня закончились идеи, я буду благодарен за любую помощь.

Это исправление

if (beresp.status == 301 || beresp.status == 302) {
  if (beresp.http.Content-Encoding ~ "gzip") {
    if (beresp.http.Content-Length == "0") {
      unset beresp.http.Content-Encoding;
    }
  }
}
if (req.http.Accept-Encoding) {
    if (req.http.Accept-Encoding ~ "gzip") {
      # If the browser supports it, we'll use gzip.
      #set req.http.Accept-Encoding = "gzip";
      unset req.http.Accept-Encoding;
    }
    else if (req.http.Accept-Encoding ~ "deflate") {
      # Next, try deflate if it is supported.
      set req.http.Accept-Encoding = "deflate";
    }
    else {
      # Unknown algorithm. Remove it and send unencoded.
      unset req.http.Accept-Encoding;
    }
}

Я ставлю неустановленное Accept-Encoding, и когда ответ приходит от бэкэнда, он не пытается его TestGunZip. Вот на что это похоже. Это мое исправление, потому что у меня тоже были те же проблемы.

Иногда различным серверным модулям требуется больше времени для загрузки ответа на varnish, обычно помогает простое увеличение следующего:

backend default {
  .host = "x";
  .port = "x";
  .connect_timeout = 30s;
  .first_byte_timeout = 30s;
  .between_bytes_timeout = 30s;
  }