Skip to content

Instantly share code, notes, and snippets.

@yuxel
Last active December 29, 2015 04:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuxel/7617215 to your computer and use it in GitHub Desktop.
Save yuxel/7617215 to your computer and use it in GitHub Desktop.
Özgür Web Teknolojileri Günleri 2013'deki Varnish Konfigursayonu
# 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.
#
backend server1 {
.host = "haber.local";
.port = "8080";
}
director default round-robin {
{ .backend = server1; }
# { .backend = server2; }
}
# tarayıcıdan gelen istekler
sub vcl_recv {
# admin istekleri cache'lenmesin
if ( req.url ~ "/admin" ) {
# backend tarafi icin log
set req.http.X-request-matched = "admin";
return (pass);
}
# tarayicida varnishLogged cookies'si varsa cache'lenmesin
if (req.http.Cookie ~ "(varnishLogged)=") {
set req.http.X-request-matched = "cookieFound";
return (pass);
}
# varnishLogged haric tüm cookie'leri sil
if (req.http.Cookie) {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(varnishLogged)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
# eger temizleme islemi sonrasinda bir sey kalmamisa header'i sil
if (req.http.Cookie == "") {
unset req.http.Cookie;
}
}
# Accept-Encoding header'ini normalize et
#
# Tarayicilar farkli tipte gonderebiliyor, her accept-encoding icin ayri cache'lenmesin diye normalize ediyoruz
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} else if (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# deflate veya gzip yoksa accept-encoding header'ini sil
unset req.http.Accept-Encoding;
}
}
# Sunucular down olursa varnish tarafından set etmek için kullanılacak 'ttl'
# vlc_fetch'deki beresp.grace'den kucuk esit olmali
set req.grace = 3h;
# backend'e x-forwarded-for header'inda IP'yi tasi
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 != "PURGE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* RFC2616'ye uymayan garip bir istek varsa backend'e pipe'la */
return (pipe);
}
# istemci Cache-Control no-cache olarak set etmisse
if (req.http.Cache-Control ~ "no-cache") {
return (pass);
}
# sadece haber ile baslayan adresleri cache'le
if ( req.url ~ "/haber" ) {
return (lookup);
}
return (pass);
}
sub vcl_hash {
# parametrede ?utm_source gibi şeyler geçerse bunlar için ayrı cache üretme
if (req.url ~ "\?") {
set req.url=regsuball(req.url,"&(_|utm_term|utm_content|utm_source|utm_medium|utm_campaign)=([A-z0-_\-.]+)","");
set req.url=regsuball(req.url,"\?(_|utm_term|utm_content|utm_source|utm_medium|utm_campaign)=([A-z0-_\-.]+)","?");
set req.url=regsub(req.url,"\?&","?");
set req.url=regsub(req.url,"\?$","");
}
hash_data(req.url);
}
sub vcl_fetch {
# 3 saatlik cache
set beresp.grace = 3h;
# 5**'li response dönerse de 5 saniye boyunca cache'le
# anlık 10000 request gelirse hepsi backend'e inmemiş olur
if (beresp.status >= 400) {
set beresp.ttl = 5s;
set beresp.grace = 0s;
}
# sadece 200'leri cache'le
if (beresp.status != 200) {
return (hit_for_pass);
}
# cookie'de varnsihLogged varsa cache'leme
if (req.http.Cookie ~ "varnishLogged") {
set beresp.http.X-Cacheable = "no-cookieFound";
return (hit_for_pass);
# backend'den cache-control private gelirse de cache'leme
} elsif (beresp.http.Cache-Control ~ "private") {
set beresp.http.X-Cacheable = "no-cache-control=private";
return (hit_for_pass);
} else {
# cookie kalmadıysa header2ı unset et
if (beresp.http.Set-Cookie == "") {
remove beresp.http.Set-Cookie;
}
}
# sadece accept-encoding'e göre cache'i vary et
set beresp.http.Vary = "Accept-Encoding";
}
sub vcl_deliver {
set resp.http.X-Served-By = server.hostname;
if (obj.hits > 0) {
set resp.http.X-Cache-Result = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache-Result = "MISS";
}
}
# purge istegi gelirse
sub vcl_hit {
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
}
# purge istegi gelirse ama cache'de yoksa
sub vcl_miss {
if (req.request == "PURGE") {
purge;
error 200 "Not in cache";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment