Varnish似乎正在工作,但max-age = 0

Ton*_*bet 12 ubuntu caching apache2 varnish http-headers

isvarnishworking.com让我知道

Varnish似乎在该URL响应,但Cache-Control标头的"max-age"值小于1,这意味着Varnish将永远不会在此URL的缓存中提供内容.

max-age值似乎为:0

这个标题信息

The url we checked: myDomainHere.com
    HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By:   PHP/5.5.9-1ubuntu4.5
Set-Cookie: PHPSESSID=vgk7db66kh7nce8lpe5789u105; path=/
Expires:    Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  max-age=60, private, proxy-revalidate
Pragma: no-cache
Vary:   Accept-Encoding,User-Agent
Content-Encoding:   gzip
Content-Type:   text/html
Content-Length: 14192
Accept-Ranges:  bytes
Date:   Sat, 18 Jul 2015 09:31:55 GMT
X-Varnish:  324589322
Age:    0
Via:    1.1 varnish
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)

我在.htaccess中有这个

 <FilesMatch "\.(js|css)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(html|htm|php)$">
    Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我真的必须改变max-age = 0才能使清漆表现更好吗?如果是这样,我会在哪里这样做?我在ubuntu digitalocean的Droplet上使用apache2

-编辑-

这是我的 /etc/varnish/default.vcl

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
#
# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.
# sub vcl_recv {
#     if (req.restarts == 0) {
#       if (req.http.x-forwarded-for) {
#           set req.http.X-Forwarded-For =
#               req.http.X-Forwarded-For + ", " + client.ip;
#       } else {
#           set req.http.X-Forwarded-For = client.ip;
#       }
#     }
#     if (req.request != "GET" &&
#       req.request != "HEAD" &&
#       req.request != "PUT" &&
#       req.request != "POST" &&
#       req.request != "TRACE" &&
#       req.request != "OPTIONS" &&
#       req.request != "DELETE") {
#         /* Non-RFC2616 or CONNECT which is weird. */
#         return (pipe);
#     }
#     if (req.request != "GET" && req.request != "HEAD") {
#         /* We only deal with GET and HEAD by default */
#         return (pass);
#     }
#     if (req.http.Authorization || req.http.Cookie) {
#         /* Not cacheable by default */
#         return (pass);
#     }
#     return (lookup);
# }
#
# sub vcl_pipe {
#     # Note that only the first request to the backend will have
#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
#     # have it set for all requests, make sure to have:
#     # set bereq.http.connection = "close";
#     # here.  It is not set by default as it might break some broken web
#     # applications, like IIS with NTLM authentication.
#     return (pipe);
# }
#
Run Code Online (Sandbox Code Playgroud)

Not*_*aeL 4

我真的必须更改 max-age=0 才能使清漆性能更好吗?

是的。如果你想让它发挥作用,你就需要这样做。

如果是这样,我会在哪里做这个?

看来您已经做好了缓存静态内容的一切,但您似乎还想缓存 PHP 脚本执行响应:

您只是缺少session_cache_limitersession_cache_expire,它们应该是在请求的 PHP 脚本上执行的第一行,甚至在session_start().

例如,如果返回的内容是私有的,并且您想每分钟刷新一次,请尝试以下操作:

session_cache_limiter('private');
session_cache_expire(1);
Run Code Online (Sandbox Code Playgroud)

之后,您应该会Cache-Control: max-age=60, private在 Varnish 响应上看到对 PHP 生成内容的请求的正确值,包括脚本开头的那些行。

[更新]看到你的问题还没有解决,也许你应该尝试使用 Apache mod_expires 而不是手动设置 Cache-Control 标头:http://httpd.apache.org/docs/2.4/mod/mod_expires.html

这应该可以回答你的问题,但请允许我给你一些可能对你有用的额外注释,并帮助你更好地理解 Varnish 和 header 之间的Cache-Control关系:

  • 响应的默认配置max-age=0向 Varnish 和浏览器表明该响应不可缓存。除非另有配置或明确允许客户端请求,否则 Varnish将不会提供过时的内容

任何缓存(代理缓存或客户端缓存)都不会返回过时的缓存项。

来自https://www.rfc-editor.org/rfc/rfc7234#section-5.3

如果响应包含带有 max-age
指令的 Cache-Control 字段(第 5.2.2.8 节),则接收者必须忽略 Expires
字段。同样,如果响应包含 s-maxage 指令
(第 5.2.2.9 节),共享缓存接收者必须忽略 Expires
字段。在这两种情况下,Expires 中的值仅适用
于尚未实现 Cache-Control 字段的接收者。

来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

如果缓存返回过时的响应,无论是由于请求上的 max-stale 指令,还是因为缓存被配置为覆盖响应的过期时间,缓存必须使用警告 110 将警告标头附加到过时的响应(响应已过时)。

缓存可以配置为返回过时的响应而不进行验证,但前提是这不与有关缓存验证的任何“必须”级要求(例如,“必须重新验证”缓存控制指令)相冲突。

如果新请求和缓存条目都包含“max-age”指令,则两个值中较小的一个用于确定该请求的缓存条目的新鲜度。

  • Varnish 的主要目的是存储内存中可缓存的响应(当它们是新鲜的时),以便它们可以发送到相同或不同的客户端而无需重新生成它们,如果需要的话也可以促进负载平衡。

  • 当请求新鲜内容时(最常见的情况),Varnish 不会提供过时的内容,即使提供了,浏览器也不会保存它,并且每次用户请求该内容时都会生成一个新页面的新请求,不必要地点击缓存(涉及所有网络活动)而不是渲染本地存储的副本,这将非常低效并且速度明显慢!

max-age 表示客户端愿意接受年龄不大于指定时间(以秒为单位)的响应。除非还包含 max-stale 指令,否则客户端不愿意接受过时的响应。

现在,如果您仍然看到浏览器在每次加载内容时发送新请求(检查浏览器开发人员工具的网络选项卡或清漆日志),请重新检查所有内容。作为最后的手段,您还可以尝试设置正确的 html 元标记,尽管html5 不赞成使用它们,并且它们对于任何现代浏览器来说都不是必需的,并且这不是最佳实践,因此我建议不要这样做。

另外,这里还有一些关于对 PHP 脚本生成的内容进行适当的缓存控制的好读物,您可能会感兴趣。