Моя конфигурация varni sh не работает должным образом - PullRequest
0 голосов
/ 14 февраля 2020

Я очень новичок в варни sh, и у меня в последнее время дело в моих руках. Это кеширование http на сайте местного журнала (Tech Stack - Javascript + PHP). Я пытаюсь использовать varni sh 4 для кэширования сайта. То, что они хотят, чтобы я сделал, это; любые новые статьи должны немедленно появиться в FE, любые удаленные статьи должны быть немедленно удалены из FE, любые изменения в текущем внешнем виде веб-сайта должны быть применены напрямую (при изменении текущего местоположения статей их можно перетаскивать в любое место на веб-сайте на основе статей). изменение популярности.) и, наконец, любые изменения в существующих статьях должны быть немедленно применены к веб-сайту. Как вы видите в конфигурации ниже, в блоке sub vcl_recv я пытался использовать return (purge) для запросов POST, потому что новые статьи и изменения статей применяются через запрос POST. Но это не работает вообще. Когда я пытаюсь создать новый фиктивный контент или внести изменения в существующие статьи, он не очищает кэш и не показывает контент fre sh, даже если запрос POST выполнен успешно. Кроме того, на стороне BE я пытался использовать if (beresp.status == 404) для удаленных статей, но это тоже не работает. Когда я удаляю фиктивную статью, которую я создал, она тоже не удаляется, я все равно вижу устаревший контент. Как мне изменить мой конфиг, чтобы все это было сделано? Спасибо.

моя варни sh конфиг есть;


import directors;
import std;

backend server1 {
    .host = "<some ip>";
    .port = "<some port>";
}

sub vcl_init {
    new bar = directors.round_robin();
    bar.add_backend(server1);
}
sub vcl_recv {
    set req.backend_hint = bar.backend();

    if (req.http.Cookie == "") {
        unset req.http.Cookie;
    }

    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");

    if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico)") {
        unset req.http.cookie;
    }
    if (req.url ~ "\.*") {
        unset req.http.cookie;
    }
    if (req.method == "POST") {
        return(purge);
    }
}
sub vcl_deliver {

    # A bit of debugging info.
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT";
    }
    else {
        set resp.http.X-Cache = "MISS";
    }
}

sub vcl_backend_response {

    set beresp.grace = 1h;

    set beresp.ttl = 120s;

    if (bereq.url ~ "\.*") {
        unset beresp.http.Set-Cookie;
        unset beresp.http.Cache-Control;
    }
    if (bereq.method == "POST") {
       return(abandon);
   }
    if (beresp.status == 404) {
       return(abandon);
    }
    return (deliver);
}

1 Ответ

0 голосов
/ 17 февраля 2020

Нет необходимости использовать director, если у вас есть только один бэкэнд. Varni sh автоматически выберет backend, который вы объявили, если есть только 1 бэкэнд.

Очистка содержимого

Выполненный вами вызов очистки POST не идеален. Пожалуйста, загляните на следующую страницу, чтобы узнать больше о недействительности контента в Varni sh: https://varnish-cache.org/docs/6.0/users-guide/purging.html#http -purging

Фрагмент на этой странице содержит ACL для защиты вашего платформа от несанкционированных чисток.

Важно знать, что вам нужно создать хук в вашей CMS или вашем MVC контроллере, который выполняет очистку. Вот простой пример использования curl в PHP:

    $curl = curl_init("http://your.varnish.cache/url-to-purge");
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PURGE");
    curl_exec($curl);

Как видите, это HTTP-запрос, выполненный в cURL, который использует специальный метод PURGE HTTP-запроса. Этот вызов должен быть выполнен в вашем хорошем праве сразу после сохранения изменений в базе данных. Этот хук после публикации гарантирует, что Varni sh удалит этот указанный объект c из кэша.

Очистка VCL

Приведенное ниже утверждение не похоже на надежный способ удаления файлов cookie. потому что выражение удалит куки со всех страниц, которые содержат точку:

    if (req.url ~ "\.*") {
        unset req.http.cookie;
    }

То же самое относится к следующему выражению, полученному из хука vcl_backend_response:

    if (bereq.url ~ "\.*") {
        unset beresp.http.Set-Cookie;
        unset beresp.http.Cache-Control;
    }

Я полагаю некоторые страницы действительно нуждаются в куки для правильной работы. Например, панель администратора, или CMS, или, возможно, даже заголовок, который указывает, вошли ли вы в систему или нет.

Лучший способ продвижения вперед - определить черный или белый список шаблонов URL, которые могут или не могут быть. быть кэшированным.

Вот пример:

    if(req.url !~ "^/(admin|user)" {
        unset req.http.Cookie;
    }

В приведенном выше примере сохраняются файлы cookie только для страниц, которые начинаются с /admin или /user. Есть и другие способы.

Заключение

Надеюсь, очистительная часть ясна. Если нет, пожалуйста, обратите внимание на https://varnish-cache.org/docs/6.0/users-guide/purging.html#http -purging .

Относительно очистки VCL: очистка может работать, только если нужные вещи хранятся в кеше. Работа с cookie-файлами может быть сложной в Varni sh.

Просто попробуйте определить, при каких обстоятельствах cookie-файлы следует хранить для определенных c страниц. В противном случае вы можете просто удалить куки.

Надеюсь, это поможет. Удачи. Тхи js

...