Кто-нибудь знает, почему мы получаем очень низкий средний показатель попадания в кеш при использовании Wordpress (с Varnish и Nginx)?
Статистика Varnish показывает:
Коэффициент попадания: 10 100 518 Средняя скорость попадания: 0,4143 0,2690 0,1948
Есть идеи, как это исправить? Мой лак default.vcl:
# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#
backend default {
.host = "77.81.240.177";
.port = "8080";
}
acl purge {
"77.81.240.177";
}
sub vcl_recv {
# Add a unique header containing the client address
remove req.http.X-Forwarded-For;
#set req.http.X-Forwarded-For = client.ip;
set req.http.X-Forwarded-For = req.http.rlnclientipaddr;
# Let's make sure we aren't compressing already compressed formats.
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|mp3|mp4|m4v)(\?.*|)$") {
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return(lookup);
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
if (!(req.url ~ "wp-(login|admin)")) {
unset req.http.cookie;
}
if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") {
unset req.http.cookie;
set req.url = regsub(req.url, "\?.$", "");
}
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
sub vcl_fetch {
if (req.url ~ "^/$") {
unset beresp.http.set-cookie;
}
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
}
if (req.url ~ "^/w00tw00t") {
error 403 "Not permitted";
}
}
Хороший подход - проверить трафик с помощью varnishlog, чтобы увидеть, какие правила применяются.
Поскольку вы не применяете TTL, я предполагаю, что сайт wordpress предоставляет заголовки Cache-Control, такие как «max-age: 0», или «no-cache», «private» или что-то в этом роде, а varnish учитывает такие заголовки, если вы специально не скажи не делать этого, то есть:
sub vcl_fetch {
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
set beresp.ttl = 3600s;
}
Первое правило в vcl_fetch не имеет смысла, поскольку второе правило отключит все файлы cookie для всех URL-адресов, кроме wp-login / wp-admin.
Добавьте некоторую конфигурацию в vcl_deliver для вывода заголовков, в которых указано, попадание это или нет:
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
return (deliver);
}
Другой отзыв к вам config:
В vcl_recv вы делаете «unset req.http.cookie», если url не является wp-login или wp-admin, что означает, что если пользователь входит в / wp-login, а затем переходит к «/», вы отключите его cookie. Вам нужно только отключить файлы cookie в vcl_recv для URL-адресов, которые никогда не должны быть нужны, например, (js | css | png | jpg) и т. Д., И вместо этого удалить set-cookie в vcl_fetch.
Проверять, выписываться wp-лак - Плагин для WordPress, который удаляет контент в Varnish при изменении контента в WordPress. Он также поставляется с образцом VCL, который должен дать вам лучшую скорость.
backend default {
.host = "127.0.0.1";
.port = "8080";
}
acl purge {
"localhost";
}
sub vcl_recv {
if (req.request == "PURGE") {
if(!client.ip ~ purge) {
error 405 "Not allowed.";
}
return(lookup);
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
return (pass);
}
remove req.http.cookie;
return (lookup);
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 200 "Purged.";
}
}
sub vcl_fetch {
if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
return (hit_for_pass);
}
set beresp.ttl = 24h;
return (deliver);
}