我已经成功地在我的 nginx 1.6.2 上设置了 varnish 4,它可以正常工作,但是根据
http://www.isvarnishworking.com/
表明
Varnish 似乎正在响应该 URL,但是 Cache-Control 标头的“max-age”值小于 1,这意味着 Varnish 永远不会从该 URL 的缓存中提供内容。
max-age 值似乎是:0
这可能是故意的,但如果您希望 Varnish 缓存此 URL,则必须修复应用程序发送给 Varnish 的 max-age 值。
这意味着它不起作用,但不像预期的那样,并且搜索了它的配置文件,但由于 varnish 4 版本的巨大变化,这些配置文件不起作用。
请大家帮帮我。
谢谢
答案1
我知道这是重新发布旧帖,但我还是想把这个发在这里,以便任何遇到同样问题的人都能看到。
首先,您需要删除未登录用户的 cookie。下面是我的 vcl_recv 子部分的一部分:
sub vcl_recv {
# Some wordpress URL manipulation
if (req.url ~ "\?(utm_(campaign|medium|source|term)|adParams|client|cx|eid|fbid|feed|ref(id|src)?|v(er|iew))=") {
set req.url = regsub(req.url, "\?.*$", "");
}
# Pass if the page is login, admin, preview, search or xmlrpc
if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "\?s=" || req.url ~ "xmlrpc.php") {
return (pass);
}
# Some generic URL manipulation, useful for all templates that follow
# First remove the Google Analytics added parameters, useless for our backend
if (req.url ~ "(\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") {
set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "");
set req.url = regsuball(req.url, "\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "?");
set req.url = regsub(req.url, "\?&", "?");
set req.url = regsub(req.url, "\?$", "");
}
# Strip hash, server doesn't need it.
if (req.url ~ "\#") {
set req.url = regsub(req.url, "\#.*$", "");
}
# Strip a trailing ? if it exists
if (req.url ~ "\?$") {
set req.url = regsub(req.url, "\?$", "");
}
# Remove the wp-settings-1 cookie
set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");
# Remove the wp-settings-time-1 cookie
set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");
# Remove the wp test cookie
set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
# Remove the cloudflare cookie
set req.http.Cookie = regsuball(req.http.Cookie, "__cfduid=[^;]+(; )?", "");
# Remove the PHPSESSID in members area cookie
set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");
# Remove the Quant Capital cookies (added by some plugin, all __qca)
set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");
# Are there cookies left with only spaces or that are empty?
if (req.http.cookie ~ "^\s*$") {
unset req.http.cookie;
}
#Drop ALL cookies sent to WordPress, except those originating from the URLs defined.
if (!(req.url ~ "(wp-login|wp-admin|cart|my-account|checkout|addons|wordpress-social-login|wp-login\.php|forumPM|members)")) {
unset req.http.cookie;
}
}
此外,如果您未登录,您需要在后端响应中删除 cookie。您还需要指示 varnish 设置 beresp 的 TTL,以便 Age 并不总是显示 0。
sub vcl_backend_response {
if (!(bereq.url ~ "(wp-(login|admin)|login)")) {
unset beresp.http.set-cookie;
}
set beresp.ttl = 1h;
return (deliver);
}
这就是基础。
答案2
这个问题的解决方案并不在于正确配置 Varnish。这个说法有点太强烈了——你可以在 Varnish 中修复此问题。但你不应该这么做。
问题是 WordPress 发送了一个标头,阻止 Varnish 缓存其传送的对象。您需要找到 WordPress 中生成此标头的位置,然后修改、禁用或覆盖它。
答案3
默认情况下,WordPress 发送每一个访问者 Cookie,这使得 Varnish 认为每个访问者都是独一无二的,因此不应该被缓存。
要从 Varnish 中获得任何好处,您需要覆盖此行为,并在 HTTP 请求进入 Varnish 时“取消设置”或“删除” cookie。
网上有很多关于这个的文章,还有很多 Varnish VCL 文件和示例,你可以在这里找到其中一个: https://www.varnish-cache.org/trac/wiki/VCCLExampleTemplateWordpressNopurge
祝你好运!