Varnish 不缓存(MISS)

Varnish 不缓存(MISS)

我们在几个运行 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你进入你的登录页面时,并且只在那里发送。

相关内容