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

Почему у меня низкий средний показатель попадания в кеш в Varnish?

Кто-нибудь знает, почему мы получаем очень низкий средний показатель попадания в кеш при использовании 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-лак

Проверять, выписываться wp-лак - Плагин для WordPress, который удаляет контент в Varnish при изменении контента в WordPress. Он также поставляется с образцом VCL, который должен дать вам лучшую скорость.

Образец 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);
}