# 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.
#
#webserver1_13
backend webserver1 {
.host = "192.168.0.13";
.port = "12113";
.probe = {
.url = "/index.html";
.interval = 10s;
.timeout = 10s;
.window = 5;
.threshold = 4;
}
.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;
}
#webserver2_14
backend webserver2 {
.host = "192.168.0.14";
.port = "12113";
.probe = {
.url = "/index.html";
.interval = 10s;
.timeout = 10s;
.window = 5;
.threshold = 4;
}
.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;
}
#webserver_13_14
director webserver round-robin {
{
.backend = webserver1;
#.weight = 5;
}
{
.backend = webserver2;
#.weight = 5;
}
}
#allow clean cache control
acl purge {
"localhost";
"127.0.0.1";
"192.168.7.10";
}
#
# 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.http.host ~ "(.*)xxxx.xxx.com") {
set req.http.host = "xxxx.xxx.com";
}
# if ((req.http.host ~ "^xxxx.xxx.com") && (req.restarts == 0)) {
set req.backend = webserver;
# }
# elseif (req.restarts == 1) {
# set req.backend = webserver2;
# }
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return (lookup);
}
#real IP
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;
}
}
#gzip,need zlib-devel
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
elseif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
}
else {
remove req.http.Accept-Encoding;
}
}
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);
}
if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|m3u8|mp4|flv|ts)$") {
unset req.http.cookie;
}
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);
}
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 = 0s;
error 200 "Purged.";
}
return (deliver);
}
#
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
set req.http.host = "miss";
return (fetch);
}
#
sub vcl_fetch {
#Define what state into the restart model
if (beresp.status == 500 || beresp.status == 501 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504) {
set req.http.host = "status";
set beresp.saintmode = 10s;
return (restart);
}
#The definition does not contain the cache HTTP header request
if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "no-cache" || beresp.http.Cache-Control ~ "private") {
return (hit_for_pass);
}
#Define different content cache time
if (req.request == "GET" && req.url ~ "\.(css|js|html|htm)$") {
set beresp.ttl = 7d;
}
if (req.request == "GET" && req.url ~ "\.(gif|jpg|jpeg|bmp|tiff|tif|ico|img|bmp|wmf)$") {
set beresp.ttl = 10d;
}
if (!req.backend.healthy) {
set req.grace = 1m;
}
else {
set req.grace = 30s;
}
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);
}
return (deliver);
}
#
sub vcl_deliver {
#set resp.http.x-hits = obj.hits;
set resp.http.x-hits = req.restarts;
set resp.http.x-hits = req.http.host;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
}
else {
set resp.http.X-Cache = "MISS";
}
return (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>
<h3>Guru Meditation:</h3>
<p>XID: "} + req.xid + {"</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
"};
return (deliver);
}
#
# sub vcl_init {
# return (ok);
# }
#
# sub vcl_fini {
# return (ok);
# }
varnish 503 的配置(需改进)
最新推荐文章于 2021-03-10 05:33:46 发布