2

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

任何人都可以提出解决方案吗?

这是我到目前为止在清漆配置中所做的更改:

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

2 回答 2

4

“清除部分”只能在&中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);
}
于 2015-12-17T14:16:14.943 回答
1

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

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

于 2016-04-27T19:52:55.457 回答