varnish - 升级 Varnish 配置。 vcl_hit 中的 obj.ttl 和 beresp.ttl 不起作用

标签 varnish varnish-vcl varnish-4

我一直在关注有关设置 haproxy 和 varnish 的教程。 ( Link ) 但是,该教程是几年前编写的。我一直在尝试更改 V3 varnish 配置,并在这部分遇到了问题:

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

有人可以提出解决方案吗?

这是我迄今为止在 Varnish 配置中所做的更改:

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);
        }
}

最佳答案

“清除部分”只能位于 vcl_recv 中,并从 vcl_hitvcl_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);
}

关于varnish - 升级 Varnish 配置。 vcl_hit 中的 obj.ttl 和 beresp.ttl 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280543/

相关文章:

wordpress - Varnish 未启动语法错误

cookies - Varnish 4 vcl_deliver 从 backend_response 中删除 set-cookie

linux - 通过网络连接到 Varnish 4 管理界面

kubernetes - 要求BAN要求的Http 400

apache - 如何设置 Varnish 以与 Apache 和 Tomcat 一起工作

apache - Magento-Varnish 最佳 VCL 配置

Varnish:使每个 API key 对象单独缓存

wordpress - Varnish 不缓存wordpress网站。尝试了博客中存在的一些解决方案。没什么对我有用

http - 使用 Varnish 缓存并改变自定义设置的 HTTP header

php - 为什么这个 SQL 查询会杀死我的服务器?