首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Varnish忽略ttl

Varnish忽略ttl
EN

Stack Overflow用户
提问于 2016-02-22 17:54:11
回答 1查看 389关注 0票数 0

我有一个问题,我找不到它的来源。

我在一个带有Nginx的专用服务器上使用Varnish Cache,并将网站重定向到它们的后端。

每件事都像一个魔力期望的东西,所有的页面都被缓存了2分钟,即使我为每个页面定义了不同的ttl,定义的ttl被忽略或绕过了,或者其他什么。

下面是我的配置:

/etc/varnish/vcl_backend_response:

代码语言:javascript
复制
#example.com:
if (beresp.http.host == "example.com" || beresp.http.host == "www.example.com" ) {
include "/etc/varnish/backend_response/example.conf";
}
return(deliver);

        set beresp.http.Vary = "Accept-Encoding";
        set beresp.ttl = 1h;

        if (beresp.ttl <= 0s ||
                beresp.http.Set-Cookie ||
                beresp.http.Vary == "*") {
                set beresp.ttl = 120 s;
                set beresp.uncacheable = true;
                return (deliver);
        }

        unset beresp.http.Server;
        set beresp.http.Server = "Microsoft IIS/7.5";

    if (beresp.http.content-type ~ "text") {
        set beresp.do_gzip = true;
    }

    if (bereq.http.X-UA-Device) {
        if (!beresp.http.Vary) { # no Vary at all
            set beresp.http.Vary = "X-UA-Device";
        } elseif (beresp.http.Vary !~ "X-UA-Device") { # add to existing Vary
            set beresp.http.Vary = beresp.http.Vary + ", X-UA-Device";
        }
    }
        set beresp.http.X-UA-Device = bereq.http.X-UA-Device;
        set beresp.grace = 2h;

}

/etc/varnish/backend_response/example.conf

代码语言:javascript
复制
if (bereq.url ~ "(?i)\.(css|bmp|tif|ttf|docx|woff2|js|pict|tiff|eot|xlsx|jpg|csv|eps|woff|xls|jpeg|doc|ejs|otf|pptx|gif|pdf|swf|svg|ps|ico|pls|midi|svgz|class|png|ppt|mid|webp|jar)(\?[a-zA-Z0-9\=\.\-]+)?$") {
        set beresp.ttl = 4h;
        unset beresp.http.expires;
        set beresp.http.cache-control = "max-age=345600";
        set beresp.http.magicmarker = "1";
        set beresp.grace = 300m;
        set beresp.do_gzip = true;
} elseif(bereq.url == "/" ) {
        set beresp.ttl = 1m;
        set beresp.grace = 300m;
        set beresp.do_gzip = true;
} else {
        set beresp.ttl = 5m;
        set beresp.grace = 300m;
        set beresp.do_gzip = true;
}

首页被缓存了1m,其余页面被缓存了5m,但由于未知的原因,所有页面都被缓存了200万。

/etc/varnish/vcl_recv.conf:

代码语言:javascript
复制
sub vcl_recv {

#exmaple.com:
        if (req.http.host == "exmaple.com" || req.http.host == "www.exmaple.com" ) {
                set req.backend_hint = exmaple;
                include "/etc/varnish/recv/exmaple.conf";
        }

include "/etc/varnish/recv/global.conf";
    unset req.http.cookie;
    unset req.http.Accept-Encoding;

call identify_device;

        if (req.method != "GET" && req.method != "HEAD") {
                return (pass);
        }

        if (req.http.Authorization || req.http.Cookie) {
                return (pass);
        }

        if (req.http.Accept-Encoding) {
                if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
                        unset req.http.Accept-Encoding;
                } elseif (req.http.Accept-Encoding ~ "gzip") {
                        set req.http.Accept-Encoding = "gzip";
                } elsif (req.http.Accept-Encoding ~ "deflate") {
                        set req.http.Accept-Encoding = "deflate";
                } else {
                        unset req.http.Accept-Encoding;
                }
        }

        if (req.http.Cookie) {
                set req.http.Cookie = regsuball(req.http.Cookie, "(^|(?<=; )) *__utm.=[^;]+;? *", "\1");

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

}

/etc/varnish/recv/exmaple.conf:

代码语言:javascript
复制
if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
        set req.http.X-Forwarded-For = client.ip;
}
if (req.method != "GET" && req.method != "HEAD") {
        return(pass);
}
if (req.url ~ "(?i)\.(css|bmp|tif|ttf|docx|woff2|js|pict|tiff|eot|xlsx|jpg|csv|eps|woff|xls|jpeg|doc|ejs|otf|pptx|gif|pdf|swf|svg|ps|ico|pls|midi|svgz|class|png|ppt|mid|webp|jar)(\?[a-zA-Z0-9\=\.\-]+)?$") {
        unset req.http.cookie;
        return (hash);
} elseif (req.url ~ "/custom-page") {
        return (pass);
} elseif (req.url == "/" ) {
        return (hash);
} else {
        return (hash);
}

有什么线索吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-24 17:15:08

您的代码总是进入这个if块,因此将ttl设置为120s。一定要检查这3个条件中哪一个或多个的计算结果为真(通过逐个删除if条件中的它们)

代码语言:javascript
复制
  if (beresp.ttl <= 0s ||
                beresp.http.Set-Cookie ||
                beresp.http.Vary == "*") {
                set beresp.ttl = 120 s; 
                set beresp.uncacheable = true;
                return (deliver);
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35550513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档