Обновление конфига лака. obj.ttl и beresp.ttl в vcl_hit не работают

Я следовал учебному пособию по настройке haproxy и лака. ( Ссылка) Однако учебник был написан много лет назад. Я пытался изменить конфигурацию лака V3 и столкнулся с проблемой в этой части:

sub vcl_hit {
        # Purge
        if (req.request == "PURGE") {
                set obj.ttl = 0s;
                error 200 "Purged.";
        }

        return (deliver);
}

set obj.ttl = 0s; устарел. Это выдает эту ошибку при запуске сервиса:

Stopping Varnish Cache:                                    [FAILED]
Starting Varnish Cache: Error:

Variable 'obj.ttl' is read only.
At: ('input' Line 46 Pos 21)

Кто-то сказал beresp.ttl следует использовать вместо этого, но это не поддерживается в методе vcl_hit:

Message from VCC-compiler:
'beresp.ttl': cannot be set in method 'vcl_hit'.
At: ('input' Line 95 Pos 21)
                set beresp.ttl = 0s;

--------------------##########-------

Running VCC-compiler failed, exited with 2
VCL compilation failed

Кто-нибудь может предложить решение для этого?

Вот что я изменил в конфигурации лака:

vcl 4.0;
backend apache2_static {
        .host = "127.0.0.1";
        .port = "3001";
        .connect_timeout = 3s;
        .first_byte_timeout = 10s;
        .between_bytes_timeout = 5s;
        .probe = {
                .url = "/haproxycheck";
                .expected_response = 200;
                .timeout = 1s;
                .interval = 3s;
                .window = 2;
                .threshold = 2;
                .initial = 2;
        }
}

acl purge {
        "localhost";
}

sub vcl_recv {
### Default options

        # Health Checking
        if (req.url == "/varnishcheck") {
                return (synth(751, "health check OK!"));
        }

        # Set default backend
        set req.backend_hint = apache2_static;

        # grace period (stale content delivery while revalidating)
        #
        # This is now handled in vcl_hit.
        #
        # set req.grace = 30s;

        # Purge request
        if (req.method == "PURGE") {
                if (!client.ip ~ purge) {
                        return (synth(405, "Not allowed."));
                }
                return (hash);
        }

        # Accept-Encoding header clean-up
        if (req.http.Accept-Encoding) {
                # use gzip when possible, otherwise use deflate
                if (req.http.Accept-Encoding ~ "gzip") {
                        set req.http.Accept-Encoding = "gzip";
                } elsif (req.http.Accept-Encoding ~ "deflate") {
                        set req.http.Accept-Encoding = "deflate";
                } else {
                        # unknown algorithm, remove accept-encoding header
                        unset req.http.Accept-Encoding;
                }

                # Microsoft Internet Explorer 6 is well know to be buggy with compression and css / js
                if (req.url ~ ".(css|js)" && req.http.User-Agent ~ "MSIE 6") {
                        unset req.http.Accept-Encoding;
                }
        }

### Per host/application configuration
        # apache2_static
        # Stale content delivery
        # Cookie ignored in these static pages
        unset req.http.cookie;

### Common options
         # Static objects are first looked up in the cache
        if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
                return (hash);
        }

        # if we arrive here, we look for the object in the cache
        return (hash);
}

sub vcl_hash {
        hash_data(req.url);
        if (req.http.host) {
                hash_data(req.http.host);
        } else {
                hash_data(server.ip);
        }
        return (lookup);
}

sub vcl_hit {
        # Purge
        if (req.method == "PURGE") {
                set obj.ttl = 0s;
                return (synth(200, "Purged."));
        }

        return (deliver);
}

sub vcl_miss {
        # Purge
        if (req.method == "PURGE") {
                return (synth(404, "Not in cache."));
        }

        return (fetch);
}

sub vcl_backend_response {
        # Stale content delivery
        set beresp.grace = 1d;

        # Hide Server information
        unset beresp.http.Server;

        # Store compressed objects in memory
        # They would be uncompressed on the fly by Varnish if the client doesn't support compression
        if (beresp.http.content-type ~ "(text|application)") {
                set beresp.do_gzip = true;
        }

        # remove any cookie on static or pseudo-static objects
        unset beresp.http.set-cookie;

        return (deliver);
}

sub vcl_deliver {
        unset resp.http.via;
        unset resp.http.x-varnish;

        # could be useful to know if the object was in cache or not
        if (obj.hits > 0) {
                set resp.http.X-Cache = "HIT";
        } else {
                set resp.http.X-Cache = "MISS";
        }

        return (deliver);
}

sub vcl_backend_error {
        # Health check
        if (beresp.status == 751) {
                set beresp.status = 200;
                return (deliver);
        }
}

sub vcl_synth {
        # Health check
        if (resp.status == 751) {
                set resp.status = 200;
                return (deliver);
        }
}

2 ответа

Решение

"Часть продувки" должна быть только в vcl_recv и удален из vcl_hit & vcl_miss,

Вы также должны изменить его в vcl_recv,

sub vcl_recv {
### Default options

    # Health Checking
    if (req.url == "/varnishcheck") {
            return (synth(751, "health check OK!"));
    }

    # Set default backend
    set req.backend_hint = apache2_static;

    # grace period (stale content delivery while revalidating)
    #
    # This is now handled in vcl_hit.
    #
    # set req.grace = 30s;

    # Purge request
    if (req.method == "PURGE") {
            if (!client.ip ~ purge) {
                    return (synth(405, "Not allowed."));
            }
            return (purge);
    }

    # Accept-Encoding header clean-up
    if (req.http.Accept-Encoding) {
            # use gzip when possible, otherwise use deflate
            if (req.http.Accept-Encoding ~ "gzip") {
                    set req.http.Accept-Encoding = "gzip";
            } elsif (req.http.Accept-Encoding ~ "deflate") {
                    set req.http.Accept-Encoding = "deflate";
            } else {
                    # unknown algorithm, remove accept-encoding header
                    unset req.http.Accept-Encoding;
            }

            # Microsoft Internet Explorer 6 is well know to be buggy with compression and css / js
            if (req.url ~ ".(css|js)" && req.http.User-Agent ~ "MSIE 6") {
                    unset req.http.Accept-Encoding;
            }
    }

### Per host/application configuration
    # apache2_static
    # Stale content delivery
    # Cookie ignored in these static pages
    unset req.http.cookie;

### Common options
     # Static objects are first looked up in the cache
    if (req.url ~ "\.(gif|jpg|jpeg|swf|css|js|flv|mp3|mp4|pdf|ico|png)(\?.*|)$") {
            return (hash);
    }

    # if we arrive here, we look for the object in the cache
    return (hash);
}

vcl_hit метод

sub vcl_hit {
    return (deliver);
}

vcl_miss метод

sub vcl_miss {
    return (fetch);
}

vcl_hit() и vcl_miss(), к сожалению, больше не находятся в пути кода PURGE для Varnish 4. Я всегда успешно использовал его с Varnish 3 для сообщения о недействительности кэша. Я спросил сотрудников Varnish Software, почему он был удален, и они только сказали, что он не точный, потому что у вас могут быть разные варианты для obj в кеше. Я не согласен с их решением, так как было бы полезно проверить, что вариант, который вы хотите очистить, действительно был очищен.

В другом ответе я просто удалил vcl_hit() и vcl_miss() и позволил запустить обработчик по умолчанию, так как вы не добавляете никаких дополнительных условий.

Другие вопросы по тегам