Я получаю периодические медитации гуру в лаке (например, я отправляю 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;
}