4

我有一个专门的服务器来托管我自己的网站。我已经使用默认的 VCL 文件安装了清漆。现在我想告诉 varnish 执行以下操作:

  1. 仅缓存以下静态文件类型(.js、.css、.jpg、.png、.gif、.jpg)。这些是提供的服务器文件类型,而不是以这些扩展名结尾的 URL。
  2. 不要缓存大于 1M 字节的文件
  3. 任何文件的缓存都应在 1 天(或任何期限)内到期。
  4. 只有当 Apache 发送 200 个 HTTP 代码时才可能发生缓存。

否则,请保持请求不变,以便由 Apache 或任何后端提供服务。

我应该在 VCL 文件中写什么来实现这些要求?或者我该怎么办?

4

2 回答 2

2

我做了什么 :

1-将所有静态内容隔离到另一个域(即提供动态页面的域与提供静态内容的域不同。)

2- 为提供静态内容的域分配另一个专用 IP 地址

3- 告诉 varnish 仅在端口 80 上侦听该 IP(即静态内容 IP)

4- 使用 Apache conf 控制每种静态内容类型的缓存周期(varnish 将只服从该标头)

缺点:

1- Varnish 甚至不会倾听或处理它应该保持原样的请求。由于 Apache 侦听原始 IP(性能),因此这些请求(针对动态页面)将直接发送到 Apache。

2-无需更改默认VCL默认文件(仅当您想调试时),这对那些不了解VCL语言原理的人很有帮助。

3-您正在从 Apache conf 控制一切。

优点:

1- 如果您没有备用 IP,则必须购买新的专用 IP。

谢谢

于 2013-09-29T14:00:20.880 回答
2

您可以在 vcl_fetch 子例程中完成所有这些操作。这应该被认为是伪代码。

if (beresp.http.content-type ~ "text/javascript|text/css|image/.*") {
    if (std.integer(beresp.http.Content-Length,0) < /* max size in bytes here */ ) {
        if (beresp.status == 200) { /*  backend returned 200 */
            set obj.ttl = 86400; /* cache for one day */
            return (deliver);
        }
    }
} 
set obj.ttl = 120;
return (hit_for_pass); /* won't be cached */
于 2013-08-11T22:01:58.260 回答