isvarnishworking.com让我知道
Varnish似乎在该网址响应,但缓存控制 header的“max-age”值小于1,这意味着Varnish会 永远不会在此网址上提供缓存中的内容。
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
我在.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>
所以我的问题,我真的必须改变max-age = 0才能使清漆表现更好吗?如果是这样,我会在哪里这样做?我在ubuntu digitalocean的droplet上使用apache2
-edit -
这是我的/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);
# }
#
答案 0 :(得分:4)
我是否真的必须更改max-age = 0才能进行清漆 更好?
是。如果您希望它完全执行, 需要。
如果是这样,我会在哪里这样做?
看起来你有一切正确的缓存静态内容,但你似乎也想缓存PHP脚本执行响应:
您只是缺少session_cache_limiter和session_cache_expire,这应该是在请求的PHP脚本上执行的第一行,甚至在session_start()
之前。
例如,如果返回的内容是私有的,并且您希望每分钟刷新一次,请尝试以下操作:
session_cache_limiter('private');
session_cache_expire(1);
之后,对于PHP生成内容(包括脚本开头的那些行)的请求,您应该在Varnish响应中看到正确的Cache-Control: max-age=60, private
值。
[更新] 看到你的问题还没有解决,也许你应该尝试使用Apache mod_expires而不是手动设置Cache-Control标头:http://httpd.apache.org/docs/2.4/mod/mod_expires.html
这应该回答你的问题,但请允许我给你一些额外的注意事项,这些注释可能对你有用,并帮助你更好地理解Varnish和Cache-Control
标题之间的关系:
max-age=0
表示Varnish和
浏览器,响应不可缓存。除非在客户的请求中另外配置或明确允许,否则使用Varnish will not serve stale content:任何缓存都不会返回过时的缓存项(代理缓存或 客户端缓存)。
来自https://tools.ietf.org/html/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(响应失效)。
缓存可以配置为在没有的情况下返回陈旧的响应 验证,但前提是这与任何&#34; MUST&#34; -level没有冲突 有关缓存验证的要求(例如,&#34;必须重新验证&#34; 缓存控制指令)。
如果新请求和缓存条目都包含&#34; max-age&#34; 指令,然后两个值中较小的一个用于确定 该请求的缓存条目的新鲜度。
Varnish的主要目的是存储内存中可缓存的响应 (虽然它们是新鲜的)所以它们可以被发送到相同或不同的 客户端没有重新生成它们,也有利于负载平衡 如果需要的话。
当要求提供新鲜内容时,清漆不会提供陈旧内容 (最常见的情况),即使它确实如此,the browser would not be saving it并且每次都会生成一个新页面的新请求 用户请求该内容的时间,不必要地访问缓存 (涉及所有网络活动)而不是渲染 本地存储的副本,这将是非常低效和明显的 慢!
max-age表示客户端愿意接受响应 其年龄不大于指定的秒数。除非 最大指令也包括在内,客户不愿意 接受陈旧的回应。
现在,如果您仍然看到每次加载内容时浏览器都会发送新请求(请查看浏览器的网络选项卡的开发人员工具或varnish logs),请重新检查所有内容。作为最后的手段,你也可以try to set the proper html meta tags,虽然html5 deprecates them并且它们对于任何现代浏览器都不是必需的,但这不是最佳做法,所以我会反对它。
此处还有some good reading对您可能感兴趣的PHP脚本生成的内容进行适当的缓存控制。
答案 1 :(得分:1)
您的清漆VCL是不够的。根据您的清漆版本搜索并使用相应的VCL 3或VCL 4模板。
检查您的清漆版本:varnishd -V
如果您使用的是版本2,请升级到版本3或4。
VCL for Varnish 3: https://github.com/dreamhost/varnish-vcl-collection
VCL for Varnish 4: https://github.com/mattiasgeniar/varnish-4.0-configuration-templates/blob/master/default.vcl