
Я работаю над этим уже два дня, но безуспешно.
Итак, по сути, я хочу обойти кэш Varnish для определенного URL входящего запроса.
Я определил это правило:
sub vcl_recv {
if (req.url ~ "/en/reading-books/") { return(pass); }
}
Но когда я обновляю страницу, она все еще кэшируется, заголовки ответа возвращают следующее:
via: 1.1 varnish-v4
x-varnish: 2
и эта фоновая команда выдает следующий вывод:
varnishncsa -F '%{Host}i %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"'
Что я здесь упускаю? Любые указания будут очень признательны.
решение1
Обновитесь до поддерживаемой версии
Прежде чем говорить об отладке кэширования входящего URL, я хочу отметить, чтовы используете устаревшую версию Varnish, в которой имеются известные уязвимости безопасности.
Пожалуйста, обновитесь до последней версии или используйте Varnish Cache 6.0 LTS.
Видетьhttps://www.varnish-software.com/developers/tutorials/#installationsдля получения списка руководств по установке для различных дистрибутивов Linux.
Соответствие точному URL-адресу или шаблону URL-адреса
Код VCL, которым вы поделились, обходит кэш для /en/reading-books
. Вы пытаетесь выполнить точное совпадение по этому URL или шаблону, который соответствует набору URL?
Для точного соответствия я бы изменил URL следующим образом:
sub vcl_recv {
if (req.url == "/en/reading-books/") {
return(pass);
}
}
При сопоставлении нескольких URL-адресов, все из которых начинаются с /en/reading-books/
, я бы настроил VCL следующим образом:
sub vcl_recv {
if (req.url == "^/en/reading-books/.*$") {
return(pass);
}
}
Что насчет заголовков ответов, специфичных для Varnish?
В своем вопросе вы упомянули следующие заголовки:
via: 1.1 varnish-v4
x-varnish: 2
Это указывает на то, что вы используете Varnish, но не обязательно, что Varnish обслуживает ответ из кэша.
Заголовок via
просто информирует пользователя о том, что Varnish является прокси-сервером в цепочке ответов.
Значение заголовка x-varnish
обычно относится к идентификатору транзакции, обработавшей ваш запрос.
На самом деле это Age
заголовок, который указывает, как долго ответ был обработан из кэша.
Проверка журналов
Команда varnishncsa
имеет доступ к журналам общей памяти Varnish, но на самом деле не отображает много полезной информации о кэшировании.
Целью varnishncsa
является возврат информации журнала доступа, аналогичной той, которую возвращают Apache и Nginx.
Для отладки кэширования выполните следующую команду:
varnishlog -g request -q "ReqUrl ~ '^/en/reading-books/.*$'"
В то время как varnishncsa
производит однострочный ответ в формате NCSA, varnishlog
вернет полную транзакцию. Пожалуйста, добавьте вывод из varnishlog
к вашему вопросу, и я помогу вам отладить.