varnish4的安装与配置

1. varnish4安装

varnish4下载地址

下载varnish4点击这里 提取码是080m

   25  yum -y install libtool ncurses-devel pcre-devel libxslt pkgconfig groff python-imaging libedit-devel python-docutils
   26  cd varnish/ #这个路径下存放着varnish4.19的包
   27  gunzip varnish-4.1.9.tgz 
   28  ls
   29  tar -xf varnish-4.1.9.tar 
   30  cd varnish-4.1.9/
   31  ./configure --prefix=/usr/local/varnish --enable-developer-warnings --enable-debugging-symbols --enable-dependency-tracking
   32  make && make install
   33  ln -s /usr/local/varnish/bin/* /usr/bin/
   34  ln -s /usr/local/varnish/sbin/* /usr/sbin/
   35  cd /usr/local/varnish/share/doc/varnish/
   36  cp example.vcl /usr/local/varnish/default.vcl

2. varnish4运行原理图

在这里插入图片描述

3. varnish4相对于varnish2升级的地方

4版本新增程序

  • vcl_purge 清理模式,当查找到对应的缓存时清除并调用,用于请求方法清除缓存,并报告
  • vcl_backend_fetch 和vcl_fetch基本相同 向后端发送请求之前调用,可用于改变请求地址或其它信息,或放弃请求
  • vcl_backend_reponse 后端响应后调用,可用于修改缓存时间及缓存相关信息
  • vcl_backend_error 后端处理失败调用,异常页面展示效果处理,可自定义错误响应内容
  • vcl_synth 自定义响应内容
  • vcl_init 加载vcl时最先调用,用于初始化
  • vcl_fini 用于卸载当前vcl时调用,不参与请求处理,仅在 vcl 正常丢弃后调用

4. varnish4 vcl的配置

vcl 4.0; 
import directors; 
import std;  

probe backend_healthcheck { 
  .url="/"; 
  .interval = 5s; 
  .timeout = 1s; 
  .window = 5; 
  .threshold = 3;
}


backend web_app_01 { 
  .host = "192.168.1.111"; 
  .port = "80"; 
  .first_byte_timeout = 9s; 
  .connect_timeout = 3s; 
  .between_bytes_timeout = 1s; 
  .probe = backend_healthcheck;
}
backend web_app_02 { 
  .host = "192.168.1.112"; 
  .port = "80"; 
  .first_byte_timeout = 9s; 
  .connect_timeout = 3s; 
  .between_bytes_timeout = 1s; 
  .probe = backend_healthcheck;
}


acl purgers {
  "127.0.0.1";
  "localhost";
  "192.168.1.0/24";
}


sub vcl_init { 
  new web = directors.round_robin(); 
  web.add_backend(web_app_01);
  web.add_backend(web_app_02);
}


sub vcl_recv {

  set req.backend_hint = web.backend();

  if (req.method == "PURGE") {
  if (!client.ip ~ purgers) {
    return (synth(405, "Not Allowed."));
  }

  return (purge);
  }

  if (req.method != "GET" && 
      req.method != "HEAD" &&
	  req.method != "PUT" &&
	  req.method != "POST" &&
	  req.method != "TRACE" &&
	  req.method != "OPTIONS" &&
	  req.method != "PATCH" &&
	  req.method != "DELETE") {
	  return (pipe);
  }

  if (req.method != "GET" && 
      req.method != "HEAD") {
	  return (pass);
  }

  if (req.http.Authorization) {
    return (pass);
  }
  
if (req.http.Accept-Encoding) {
	 if (req.http.Accept-Encoding ~ "gzip") { 
		 set req.http.Accept-Encoding = "gzip";
}
elsif (req.http.Accept-Encoding ~ "deflate") {
	 set req.http.Accept-Encoding = "deflate";
}
else {
	 unset req.http.Accept-Encoding;
}
}
  
    if (req.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico|gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
      unset req.http.cookie; 
	  return (hash);
	}
	

	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; 
      }
	}
    return (hash);
}


sub vcl_hash { 
  hash_data(req.url); 
  if (req.http.host) { 
    hash_data(req.http.host); 
	} else {  
	hash_data(server.ip); 
	} 
	return (lookup);	
  }
  

sub vcl_hit { 
  if (req.method == "PURGE") { 
    return (synth(200, "Purged.")); 
  } 
  return (deliver);
}


sub vcl_miss { 
  if (req.method == "PURGE") { 
    return (synth(404, "Purged.")); 
	} 
	return (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";
  }

  unset resp.http.X-Powered-By;

  unset resp.http.Server;
  unset resp.http.X-Drupal-Cache;  
  unset resp.http.Via;
  unset resp.http.Link;
  unset resp.http.X-Varnish;

  set resp.http.xx_restarts_count = req.restarts;
  
  set resp.http.xx_Age = resp.http.Age;

  set resp.http.hit_count = obj.hits;
  unset resp.http.Age;
  return (deliver);
}


sub vcl_pass { 
  return (fetch);
}


sub vcl_backend_response { 
  set beresp.grace = 5m;
  if (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
  set beresp.uncacheable = true;
  }

  if (bereq.url ~ "\.(php|jsp)(\?|$)") {
    set beresp.uncacheable = true;
  } else { 
    if (bereq.url ~ "\.(css|js|html|htm|bmp|png|gif|jpg|jpeg|ico)($|\?)") {
	  set beresp.ttl = 15m;
	  unset beresp.http.Set-Cookie;
	} elseif (bereq.url ~ "\.(gz|tgz|bz2|tbz|zip|rar|mp3|mp4|ogg|swf|flv)($|\?)") {
	  set beresp.ttl = 30m;
	  unset beresp.http.Set-Cookie;
	} else {
	  set beresp.ttl = 10m;
	  unset beresp.http.Set-Cookie;
	}
  }	

  return (deliver);
}

sub vcl_purge {
    return (synth(200,"success"));
}

sub vcl_backend_error {
  if (beresp.status == 500 ||
      beresp.status == 501 ||
	  beresp.status == 502 ||
	  beresp.status == 503 ||
	  beresp.status == 504){
	  return (retry);
  }
}

sub vcl_fini {
    return (ok);
}

发布了67 篇原创文章 · 获赞 56 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43557605/article/details/102816678
今日推荐