Skip to content

Instantly share code, notes, and snippets.

@hitxiang
Last active December 31, 2015 03:09
Show Gist options
  • Save hitxiang/7925470 to your computer and use it in GitHub Desktop.
Save hitxiang/7925470 to your computer and use it in GitHub Desktop.
import std;
probe default {
.url = "/index.html";
.timeout = 30ms;
.interval = 2s;
.window = 5;
.threshold = 3;
}
acl purge {
"localhost";
}
acl localnet {
"172.16.245.0"/24;
}
backend b1 {
.host = "nfs-m-vip";
.port = "8081";
.probe = default;
}
backend b2 {
.host = "nfs-s-vip";
.port = "8081";
.probe = default;
}
backend b3 {
.host = "storage03";
.port = "8081";
.probe = default;
}
director dr1 random {
{ .backend = b1 ; .weight= 10; }
{ .backend = b2 ; .weight= 20; }
{ .backend = b3 ; .weight= 40; }
}
sub vcl_recv {
set req.grace = 60s;
# block bots
if (req.http.User-Agent ~ "(Googlebot|SRD|MBS|Slurp|Baidu|Hatena|msnbot|MSNBOT|%2Bhttp|\+http)" ) {
error 403 "forbidden";
}
# Normalize Accept-Encoding header
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unkown algorithm
remove req.http.Accept-Encoding;
}
}
if (req.url ~ "(_ads|flash_alt_banners|emoji|_images)") {
unset req.http.cookie;
} elsif ( req.url ~ "^/[0-9A-Za-z_]*\.(gif|jpg|png)$"){
unset req.http.cookie;
} elsif ( req.url ~ "^/(javascripts|stylesheets)"){
unset req.http.cookie;
} elsif ( req.url ~ "^/.*\.html"){
unset req.http.cookie;
}
# dont cache a.adimg.net(pc/sp js), i.adimg.net(sp img), fp.adimg.net(fp img)
if ( req.http.host ~ "^([ai]|fp)\.adimg\.net" ) {
return (pass);
}
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
return (lookup);
}
if (client.ip ~ localnet) {
set req.backend = b1;
} else {
set req.backend = dr1;
}
if ( req.restarts == 3) {
# deal with error, real file may have jpg or png extension. todo
if (req.url ~ "^/banner_ads/.*\.$") {
set req.url = req.url + "gif";
} elsif (req.http.referer ~ "v\.mapion\.co\.jp" &&
req.url ~ "^/mobile_banner_ads/.*\.png$") {
set req.url = regsub(req.url, "png$", "gif");
} else {
std.syslog(180, "FALLBACK: " + req.http.host + req.url + " |REFERER|: " + req.http.referer);
#set req.backend = fallback;
error 404 "Not existed.";
}
}
}
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 404 "Not in cache.";
}
}
sub vcl_fetch {
if (!req.backend.healthy) {
set req.grace = 1h;
}
if (beresp.status >= 400) {
return (restart);
}
if ( req.http.Accept-Encoding &&
req.url ~ "\.(html|htm|css|js|txt|xml)(\?[a-z0-9=]+)?$" ) {
set beresp.do_gzip = true;
}
if (req.url ~ "(_ads|flash_alt_banners|emoji|_images)") {
set beresp.ttl = 30d;
/* Set the clients TTL on this object 360d */
set beresp.http.cache-control = "public, max-age=31104000";
unset beresp.http.set-cookie;
} elsif ( req.url ~ "^/[0-9A-Za-z_]*\.(gif|jpg|png)$"){
set beresp.ttl = 60d;
/* Set the clients TTL on this object 360d*/
set beresp.http.cache-control = "public, max-age=31104000";
unset beresp.http.set-cookie;
} elsif ( req.url ~ "^/(javascripts|stylesheets)"){
set beresp.ttl = 6h;
/* Set the clients TTL on this object 6h*/
set beresp.http.cache-control = "public, max-age=21600";
unset beresp.http.set-cookie;
} elsif ( req.url ~ "^/.*\.html"){
set beresp.ttl = 2d;
/* Set the clients TTL on this object 2d*/
set beresp.http.cache-control = "public, max-age=172800";
unset beresp.http.set-cookie;
} elsif (req.url == "/robots.txt") {
# Purge manually as required
set beresp.ttl = 4d;
}
# TODO
if (beresp.ttl <= 0s) {
# Cannot cache. Backend provided an expired TTL
set beresp.http.X-Cacheable = "NO:ExpiredTTL";
} elsif (req.http.Cookie) {
# Presence of cookies.
set beresp.http.X-Cacheable = "NO:Cookies";
} elsif (beresp.http.Cache-Control ~ "private") {
# Cache-control is private
set beresp.http.X-Cacheable = "NO:Cache-Control=private";
} else {
set beresp.http.X-Cacheable = "YES";
}
set beresp.http.x-url = req.url;
set beresp.http.x-host = req.http.host;
return(deliver);
}
sub vcl_deliver {
# TODO debug
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
unset resp.http.Server;
unset resp.http.Via;
unset resp.http.Age;
unset resp.http.X-Varnish;
unset resp.http.x-url;
unset resp.http.x-host;
return (deliver);
}
sub vcl_error {
# CVE-2013-4484
if (obj.status == 400 || obj.status == 413) {
return(deliver);
}
if (obj.status == 503 && req.restarts < 2) {
return (restart);
}
}
@hitxiang
Copy link
Author

fetch

cache 404s and 301s for 5 minute

if (beresp.status == 404 || beresp.status == 301 || beresp.status == 500) {
set beresp.ttl = 5m;
return (deliver);
}

@hitxiang
Copy link
Author

---OK---
218.222.210.104 - - [13/Dec/2013:16:52:12 +0900] "GET http://b4.i.adimg.net/banner_ads/0016/6307/89ad24c0e7c02a9094922a81e797435c31e4d8c0.gif HTTP/1.1" 200 43 "http://sangocere.269g.net/category/435549-2.html" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)"

---NG---
123.233.227.174 - - [13/Dec/2013:16:26:33 +0900] "GET http://b4.i.adimg.net/banner_ads/0016/6307/89ad24c0e7c02a9094922a81e797435c31e4d8c0 HTTP/1.0" 302 160 "http://heartyou.269g.net/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30"

123.233.227.174 - - [13/Dec/2013:16:26:33 +0900] "GET http://b4.i.adimg.net/banner_ads/0016/6307/ HTTP/1.0" 404 398 "http://heartyou.269g.net/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.53 Safari/534.30"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment