Last active
December 29, 2015 04:49
-
-
Save yuxel/7617215 to your computer and use it in GitHub Desktop.
Özgür Web Teknolojileri Günleri 2013'deki Varnish Konfigursayonu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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