![Varnish 不缓存(MISS)](https://linux22.com/image/741720/Varnish%20%E4%B8%8D%E7%BC%93%E5%AD%98%EF%BC%88MISS%EF%BC%89.png)
我们在几个运行 Nginx/CraftCMS 的网站前安装了 varnish 服务器。除一个网站外,其他所有网站都按预期进行缓存。
在过去的一周里,我们阅读了所有教程,检查了所有答案,并且一定做了 100 次配置调整。目前,我们几乎取消了所有标题的设置,但仍然无法确定原因。
该网站没有用户特定的内容并且可以完全忽略 cookie。
BerespStatus 200
- BerespReason OK
- BerespHeader Server: nginx/1.14.0 (Ubuntu)
- BerespHeader Date: Tue, 20 Aug 2019 11:14:35 GMT
- BerespHeader Content-Type: text/html; charset=utf-8
- BerespHeader Transfer-Encoding: chunked
- BerespHeader Connection: keep-alive
- BerespHeader Vary: Accept-Encoding
- BerespHeader Set-Cookie: CraftSessionId=XXX; path=/; secure; HttpOnly
- BerespHeader Expires: Thu, 19 Nov 1981 08:52:00 GMT
- BerespHeader X-Powered-By: Craft CMS
- BerespHeader Cache-Control: no-cache
- BerespHeader Pragma: no-cache
- BerespHeader charset: utf-8
- BerespHeader Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
- BerespHeader X-XSS-Protection: 1; mode=block
- BerespHeader X-Content-Type-Options: nosniff
- BerespHeader Access-Control-Allow-Origin: *
- BerespHeader X-UA-Compatible: IE=Edge
- BerespHeader Content-Encoding: gzip
- TTL RFC 0 10 0 1566299675 1566299675 1566299675 375007920 0
- VCL_call BACKEND_RESPONSE
- BerespUnset Set-Cookie: CraftSessionId=XXX; path=/; secure; HttpOnly
- BerespUnset Cache-Control: no-cache
- BerespUnset Pragma: no-cache
- BerespUnset Vary: Accept-Encoding
- BerespUnset Date: Tue, 20 Aug 2019 11:14:35 GMT
- BerespUnset Expires: Thu, 19 Nov 1981 08:52:00 GMT
- TTL VCL 120 10 0 1566299675
- VCL_return deliver
- BerespHeader Vary: Accept-Encoding
- Storage malloc Transient
- ObjProtocol HTTP/1.1
- ObjStatus 200
- ObjReason OK
- ObjHeader Server: nginx/1.14.0 (Ubuntu)
- ObjHeader Content-Type: text/html; charset=utf-8
- ObjHeader X-Powered-By: Craft CMS
- ObjHeader charset: utf-8
- ObjHeader Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
- ObjHeader X-XSS-Protection: 1; mode=block
- ObjHeader X-Content-Type-Options: nosniff
- ObjHeader Access-Control-Allow-Origin: *
- ObjHeader X-UA-Compatible: IE=Edge
- ObjHeader Content-Encoding: gzip
- ObjHeader Vary: Accept-Encoding
- Fetch_Body 2 chunked stream
- Gzip u F - 21276 75774 80 80 170140
如果有人有建议我们将不胜感激!
Accept-Ranges: bytes
Access-Control-Allow-Origin: *
Age: 0
charset: utf-8
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 21 Aug 2019 07:54:10 GMT
Server: nginx/1.14.0 (Ubuntu)
Strict-Transport-Security: max-age=15768000; includeSubDomains; preload
Transfer-Encoding: chunked
Vary: Accept-Encoding
Via: 1.1 varnish (Varnish/5.2)
x-Cache: MISS
X-Content-Type-Options: nosniff
X-Powered-By: Craft CMS
X-UA-Compatible: IE=Edge
X-Varnish: 858580
X-XSS-Protection: 1; mode=block
答案1
您的网站正在设置 cookie(至少从您varnishlog
输入的内容来看是这样):
- BerespHeader Set-Cookie: CraftSessionId=XXX; path=/; secure; HttpOnly
当 Varnish 发现你的后端设置了 cookie,它会将响应标记为不可缓存,在内置 VCL。
内置 VCL 在您拥有“之后”触发,您可以通过return
从 VCL 提前执行来覆盖/跳过其执行。
评估您的应用发送 cookie 的原因。由于您预计该页面会被缓存,因此这很可能既不是登录页面,也不是您真正需要设置 cookie 的地方。
常见的解决方法是使用 VCL 取消设置 cookie。但仅此还不够,因为Cache-Control
在设置 cookie 时 PHP 会设置负数。因此,您将还需要调整ttl
并指定这些响应需要缓存多长时间。
以下配置取消设置全部后端发出的 cookie,来自除 之外的任何页面/login/
。
sub vcl_backend_response {
if (beresp.http.Set-Cookie && bereq.url !~ "^/login/") {
unset beresp.http.Set-Cookie;
unset beresp.http.Cache-Control;
# cache for 1 hr
set beresp.ttl = 3600;
}
}
尽管如此,最好只是调整你的应用程序,只Set-Cookie
在绝对需要时发送,例如当POST
你进入你的登录页面时,并且只在那里发送。