升级varnish配置。 vcl_hit中的obj.ttl和beresp.ttl都没有工作

时间:2015-12-15 03:17:18

标签: varnish varnish-vcl varnish-4

我一直在关注设置haproxy和varnish的教程。 (Link)但是,该教程是在几年前编写的。我一直试图更改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

有人可以建议解决方案吗?

以下是我在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);
        }
}

2 个答案:

答案 0 :(得分:4)

"清除部分"应仅在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);
}

答案 1 :(得分:1)

遗憾的是,vcl_hit()和vcl_miss()不再位于Varnish 4的PURGE代码路径上。我总是成功地将它与Varnish 3一起用于报告缓存失效。我问Varnish Software的人为什么删除它们,他们只是说它不准确,因为你可以在缓存中有一个obj的不同变种。我不同意他们的决定,因为验证您想要清除的变体实际上已被清除仍然有用。

在提供的另一个答案中,我将删除vcl_hit()和vcl_miss()并让默认处理程序运行,因为您没有添加任何其他条件。