- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
isvarnishworking.com 让我知道
Varnish appears to be responding at that url, but the Cache-Control header's "max-age" value is less than 1, which means that Varnish will never serve content from cache at this url.
The max-age value appears to be: 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 才能使 Varnish 性能更好吗?如果是这样,我会在哪里做这个?我在 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);
# }
#
最佳答案
Do I really have to change that max-age=0 in order to varnish performbetter?
是的。如果您想让它发挥作用,您需要去做。
If so, where would I Do this?
看起来您已经准备好缓存静态内容,但您似乎还想缓存 PHP 脚本执行响应:
你只是错过了session_cache_limiter和 session_cache_expire ,这应该是在请求的 PHP 脚本上执行的第一行,甚至在 session_start()
之前.
例如,如果返回的内容是私有(private)的,并且您想每分钟刷新一次,请尝试以下方法:
session_cache_limiter('private');
session_cache_expire(1);
在那之后你应该看到一个正确的 Cache-Control: max-age=60, private
Varnish 对 PHP 生成内容请求的响应值,包括脚本开头的那些行。
[update] 看到您的问题还没有解决,也许您应该尝试使用 Apache mod_expires 而不是手动设置 Cache-Control header :http://httpd.apache.org/docs/2.4/mod/mod_expires.html
这应该可以回答您的问题,但请允许我给您一些可能对您有用的额外说明,并帮助您更好地了解 Varnish 和 Cache-Control
的工作原理。标题相互关联:
max-age=0
在响应上指示 Varnish 和浏览器响应不可缓存。除非另有配置或根据客户的要求明确允许,Varnish will not serve stale content :A stale cache item will not be returned by any cache (proxy cache orclient cache).
来自 https://www.rfc-editor.org/rfc/rfc7234#section-5.3 :
If a response includes a Cache-Control field with the max-age
directive (Section 5.2.2.8), a recipient MUST ignore the Expires
field. Likewise, if a response includes the s-maxage directive
(Section 5.2.2.9), a shared cache recipient MUST ignore the Expires
field. In both these cases, the value in Expires is only intended
for recipients that have not yet implemented the Cache-Control field.
来自 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3 :
If a cache returns a stale response, either because of a max-staledirective on a request, or because the cache is configured to overridethe expiration time of a response, the cache MUST attach a Warningheader to the stale response, using Warning 110 (Response is stale).
A cache MAY be configured to return stale responses withoutvalidation, but only if this does not conflict with any "MUST"-levelrequirements concerning cache validation (e.g., a "must-revalidate"cache-control directive).
If both the new request and the cached entry include "max-age"directives, then the lesser of the two values is used for determiningthe freshness of the cached entry for that request.
Varnish 的主要目的是在内存中存储可缓存的响应(当它们是新鲜的时候)所以它们可以被送到相同或不同的地方无需重新生成客户端,也有助于负载平衡如果需要的话。
Varnish 不会在请求新鲜内容时提供陈旧内容(最常见的情况)即使发生了,the browser would not besaving it并且会生成一个新页面的新请求用户请求该内容的时间,不必要地访问缓存(涉及所有网络事件)而不是渲染本地存储的副本,这将是非常低效且明显的慢一点!
max-age Indicates that the client is willing to accept a responsewhose age is no greater than the specified time in seconds. Unlessmax- stale directive is also included, the client is not willing toaccept a stale response.
现在,如果您仍然看到浏览器在每次加载内容时发送新请求(检查浏览器开发人员工具的网络选项卡或 varnish logs),请重新检查所有内容。作为最后的手段,您也可以 try to set the proper html meta tags , 虽然 html5 deprecates them并且它们对于任何现代浏览器都不是必需的,这不是最佳实践,因此我建议不要这样做。
这里还有some good reading关于对您可能感兴趣的 PHP 脚本生成的内容进行适当的缓存控制。
关于ubuntu - Varnish 似乎在工作,但 max-age=0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31489796/
我一生都找不到有关 Varnish (版本 3)对象可能属性的任何文档。 我们知道(从谷歌搜索中,varnish 文档只是咕哝,让你更加沮丧)例如,请求对象具有 url 属性(req.url),并且它
我们公司最近决定开始使用 Varnish HTTP 加速器。我们选择这个解决方案的最重要原因是因为我们是一家专门构建网络商店的公司 (Magento Enterprise) => Magento 有一
我们最近将Varnish放在了Drupal的前面,因为服务器承受着沉重的负担,总体而言,我们感到非常满意。 剩下的唯一问题是,有时我们在缓存的数据中会有一个无限的重定向循环。我们通过HTTP监控发现了
我正在设置连接到2个后端服务器(Magento 2应用程序)的Varnish 5实例。 我正在使用新的Varnish 5功能来加载多个VCL文件。为了使事情现在变得非常简单,我将在示例中使用1个后端服
我有一台 Vanilla 的Debian DigitalOcean机器,我正在尝试遵循《 Varnish 书》中的“开发人员”类(class)。我必须the first exercise, Insta
我已经为我的网站配置了Varnish,并且由于网站性能出色,但是没有人知道有任何Varnish监视工具可以查看Varnish中存储的内容以及与Memcached或APC监视工具类似的东西。 谢谢, -
我正在寻找 Varnish 高可用性设置的最佳设置。 具有多个 Varnish 实例的标准设置,每个实例都有自己的缓存存储,因此每个实例都在后端执行自己的请求。 即使使用 Varnish_Storag
我已经经历了这个 article 。有人可以帮我澄清以下有关 Varnish 各种日志位置的疑问吗? 根据 varnish 电子书 varnishncsa -显示 Varnish 访问日志和 varn
在不停机的情况下以编程方式向 Varnish director 添加或删除单个后端服务器的最佳方法是什么?我一直在寻找这方面的一个很好的例子,但找不到。 我希望能够根据需要扩展和缩减我的后端服务器。
我已经安装了 Apache 和 Tomcat,想在它们前面安装 Varnish,静态到 Apache,动态到 Tomcat(所有/static/* url 到 Apache,应该由 Varnish 缓
我目前正在做一个基于 Varnish 的项目。 我们写 vcl和 vmod .但是项目需要检查请求体。 如何在 VCL 中获取帖子请求正文或 vmod与 C function ? 最佳答案 你几乎可以
我习惯跑 varnishadm -T localhost:6082 debug.health 检查后端健康状态,但如何详细检查探测失败的原因(例如超时、错误的 http 状态代码)? 最佳答案 在 V
我正在尝试设置我的第一个 Varnish 缓存服务器,我有几个问题想问任何有经验的人。 1.) 我将 Varnish 作为独立服务器运行。我还需要在同一台服务器上安装 Apache 吗?最终,Varn
抱歉,我是 Varnish 的新手。 我正在我的 /etc/varnish/mysite.vlc 中尝试一堆东西,但无法让它工作。 我想将特定网址重定向到另一个网址。例子:如果有人访问 http://
我有这个: if (bereq.http.X-Path ~ "[a-z0-9]+\.(js|css)$") { set beresp.http.Cache-Control =
我想将Varnish用作“智能”代理,并且几乎可以正常工作。这个想法是,某些请求应通过Varnish传递,到达后端并返回,所有其他请求应返回“synt”消息,表明特定响应不包含任何结果。 这与Varn
我们将Varnish Cache用作许多客户的前端,并在任何后端出现问题时通过宽限期处理过时的内容。 我们现在确实有一个失败的后端,并且我们想增加宽限期(在生病的时候),这可能吗?我尝试在文档中进行挖
我们想要建立一个 Varnish 级联,以便我们进行1级和2级缓存。这意味着应要求 -1级 Varnish 的工艺和路线 -通往的 Varnish 等级2 - 应用 问题:如果应用程序现在在内容中添加
我在vcl中使用循环导演。我想查看所有缓存未命中URL和后端IP。现在在做sudo varnishtop -i BereqURL它只显示网址而不是后端IP的去向 54.42 BereqURL
是否可以设置 Varnish 以定期重建整个 field ?我在 Varnish 后面有一个播放应用程序。该应用程序生成了超过2,000页的网站号,其中大多数是产品页。是否可以将Varnish设置为从
我是一名优秀的程序员,十分优秀!