Varnish配置详解见此处
此配置适合3.X版本,varnish不同的配置文件的差距很大
[root@varnish_01 ~]# varnishd -V
varnishd (varnish-3.0.4 revision 9f83e8f)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2011 Varnish Software AS
以下是线上的示例配置文件
backend aaa { //定义后端主机aaa
.host = "192.168.118.141";
.port = "80";
}
backend bbb { //定义后端主机bbb
.host = "192.168.118.154";
.port = "80";
}
acl purge { //定义一个访问控制列表 名字叫purge
"localhost";
"127.0.0.1";
}
sub vcl_recv {
if (req.request == "PURGE") { //如果请求是purge
if (!client.ip ~ purge) { //如果客户端的IP地址不在purge访问控制列表
error 405 "Not allowed."; //返回405错误
}
return(lookup); //执行lookup函数处理缓存
}
if (req.http.host ~"www.aaa.com") { set req.backend = aaa; } //如果请求的域名是aaa,让后端主机aaa来处理请求
else { set req.backend = bbb; //如果是其他的域名,由bbb来响应
}
if (req.request == "GET" && req.url ~ "(?i)\.(jpg|png|gif|swf|jpeg|ico)$") { //如果请求的是图片文件,取出起cookie
unset req.http.cookie;
}
if (req.restarts == 0) { //获取客户端的ip地址(经过多次代理)
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") {
return (pipe);
}
if (req.url ~ "/manage(.*)$" && req.url ~ ".(aspx|asp)$") { //如果请求是manage目录下的aspx文件或者asp文件,不缓存
return (pass); }
if (req.url ~ "/jkbk(.*)$" && req.http.host ~"www\.bbb\.com") { //如果请求的url是bbb域名下的jkbk目录 不缓存
return (pass);
}
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
if (req.http.Authorization) { //如果是http认证请求,不缓存
return (pass);
} else {
return (lookup);
}
}
sub vcl_pipe {
return (pipe);
}
sub vcl_pass {
return (pass);
}
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (hash);
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0 s;
error 200 "Purged";
}
return (deliver);
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
return (fetch);
}
sub vcl_fetch {
if (req.url ~ "\.(html|htm)$") { //如果是html或者htm缓存1小时
set beresp.ttl = 1h;
unset beresp.http.set-cookie; //忽略cookie
}
if (req.url ~ "\.(asp|asp|aspx)$") { //如果动态页面需要缓存的话,千万记得不要unset cookie!!!
set beresp.ttl = 1h;
}
if (req.url ~ "\.(css|mp3|jpg|png|gif|swf|jpeg|ico|js)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 12h;
}
if (beresp.ttl <= 0s ||beresp.http.Set-Cookie ||beresp.http.Vary == "*") {
set beresp.ttl = 1h;
# return(hit_for_pass); //默认的解决方法
}
return (deliver);
}
sub vcl_deliver {
set resp.http.X-hits = obj.hits;
set resp.http.Server = "cache.ufstone.com";
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cache.ufstone.com";
} else {
set resp.http.X-Cache = "MISS cache.ufstone.com";
}
return (deliver);
}
sub vcl_error { //varnish错误的回显模板,可以自定义
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>
<h4>We are very sorry for this mistake!</h4>
<h4><p>We administrator:Master@TEST.com</p></h4>
<p>This Server is too busy!!!</p>
<p><h4>ERR UN:</h4>"} + req.xid + {"</p>
<hr>
<h1><p>----------[TEST.COM]----------</p></h1>
</body>
</html>
"};
return (deliver);
}
sub vcl_init {
return (ok);
}
sub vcl_fini {
return (ok);
}
####################################
迷途小运维原创
作者:john
转载请注明出处