开发者社区> 问答> 正文

Varnish3.02版本配置问题::配置报错 

今天准备使用最新的varnish来挡在tomcat前,配置如下,但发现很多图片无法加载,很多链接打开奇慢。麻烦帮我看看varnish的配置。注:所有配置都在同一台机器上。

backend master {
        .host = "192.168.1.31";
        .port = "8080";
			  .probe = {
			  .url = "/";
			  .timeout = 1s;
			  .interval = 5s;
			  .window = 5;
			  .threshold = 3;
			  }
}
backend slave {
        .host = "192.168.1.31";
		.port = "8080";
				.probe = {
				.url = "/";
				.timeout = 1s;
				.interval = 5s;
				.window = 5;
				.threshold = 3; 
				}
}
#允许刷新缓存的 ip
acl purgeAllow {
          "127.0.0.1";
}
#这里是定义容许监控的 IP,因为我是禁止直接 IP 访问的,有是为了监控需要
acl iplist {
          "127.0.0.1";   
		  "10.16.6.101";
		  "192.168.1.31";
}
#/acl iplist##############################################################
sub vcl_recv {  
#定义 acl iplist 列表里的 ip 访问主源,也就是监控的 IP
if ( client.ip ~ iplist ){
          set req.backend = master;
}
else {
			  if (req.http.host ~ "10.16.6.101" || req.http.host ~ "192.168.1.31" ) {   #如果 IP 直接访问,返回 403
						error 403;
				}
			  else {
						set req.backend = master;
					}
			  if (!req.backend.healthy) {    #如果检测第一个主源挂掉,就访问备源
					 set req.backend = slave;
				}
}
#判断如果不是 acl purgeAllow 定义的 IP 
if (req.request == "PURGE") {
         if (!client.ip ~ purgeAllow) { #判断是否允许 ip,如果不是,是不可以刷缓存的,返回 405
            error 405 "Not allowed.";
           }
		#去缓存中查找
		return (lookup);
}
#首次访问增加 X-Forwarded-For 头信息,方便后端程序获取客户端 ip
if (req.restarts == 0) {
        #如果设置过此 header 则要再次附加上,用,隔开,如果
        #只有一层代理的话,就无需设置了        
        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;
        }
}
#至单独服务器下,减少动态应用服务器压力,同时降低 varnishd 的压力
if(req.url ~ "\.(php)$"){
           return (pass);
}
#非正规的请求直接转发给后端服务器
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);
        }
#只处理 GET 和 HEAD 请求,如果你不想缓存 POST 的页面话
if (req.request != "GET" && req.request != "HEAD") {
           return (pass);
}            
#http 认证的页面也 pass
if (req.http.Authorization) {
           return (pass);
}

return (lookup);
}
#/sub vcl_recv##############################################################
#管道?按官方文档说的是此模式下请求会原封不动的转交给后端直到连接关闭
sub vcl_pipe {
          return (pipe);
}
#/sub vcl_pipe##############################################################
#交给后端服务器
sub vcl_pass {
        return (pass);
}
#/sub vcl_pass##############################################################
#缓存文件名的哈希处理
sub vcl_hash {
          hash_data(req.url);
            if (req.http.host) {
             hash_data(req.url);
         } else {
            hash_data(server.ip);
         }
        return (hash);
}
#/sub vcl_hit##############################################################
#缓存命中后的处理
sub vcl_hit {
          return (deliver);                    
}
#/sub vcl_hit##############################################################
#缓存未命中
sub vcl_miss {
          #更新缓存的请求,提示缓存不存在 Not in cache
          if (req.request == "PURGE") {
           error 404 "Not in cache.";
          }
        set bereq.url = regsub(req.url, "\?.*", "");
          #既然缓存不存在了,就去后端取吧
          return (fetch);
}
#/sub vcl_miss##############################################################
sub vcl_fetch {
if (beresp.ttl <= 0s || beresp.http.Set-Cookie || beresp.http.Vary == "*") {
                 /*
                  * Mark as "Hit-For-Pass" for the next 2 minutes
                  */
        set beresp.ttl = 120 s;
        return (hit_for_pass);
}
#404,300 页面不缓存
if (beresp.status == 404 || beresp.status == 300) {
         error 404;
        }
return (deliver);
}
#/sub vcl_fetch##############################################################
#发送给客户端
sub vcl_deliver {
        if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
        #统计命中了多少次
#   set resp.http.X-Cache-Hits = obj.hits;
        } else {
         set resp.http.X-Cache = "MISS";
        }
          #去掉 varnish 中的一些头信息(如果你不想保留的话,建议保留 Age,方便查看)
          remove resp.http.X-Varnish;
          remove resp.http.Via;
return (deliver);
}
#/sub vcl_deliver##############################################################
#定义错误页面的信息
sub vcl_error {
         set obj.http.Content-Type = "text/html; charset=utf-8";
         set obj.http.Retry-After = "5";
         synthetic {"
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
      <html>
          <head>
        <title>"} + obj.status + " " + obj.response + {"</title>
          </head>
		<body>
        <h1>Error "} + obj.status + " " + obj.response + {"</h1>
		<p>"} + obj.response + {"</p>
            <hr>
          </body>                   
      </html>
		"};
        return (deliver);
}
#/sub vcl_error##############################################################
sub vcl_init {
         return (ok);
}
#/sub vcl_init##############################################################
sub vcl_fini {
         return (ok);
}
#/sub vcl_fini##############################################################

展开
收起
kun坤 2020-06-04 10:24:48 562 0
1 条回答
写回答
取消 提交回答
  • 我来结贴吧,问题已经解决: Varnish3安装过程真曲折。最终搞定,pcre源码安装即可。######你这个问题没说清楚,你的意思是说pcre没安装好的问题么  ######应该是pcre没有安装好的原因,我开始是使用了yum安装了rpm包。后来换源码安装就好了。这里有详细的安装过程:http://www.oschina.net/question/222919_57963

    2020-06-04 11:21:33
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《Nginx 代理系统常用手册》 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载
低代码开发师(初级)实战教程 立即下载

相关实验场景

更多