Skip to content

Instantly share code, notes, and snippets.

@renizgo
Created October 3, 2017 14:17
Show Gist options
  • Save renizgo/1551b90c61958c35c0217ae8af9298a6 to your computer and use it in GitHub Desktop.
Save renizgo/1551b90c61958c35c0217ae8af9298a6 to your computer and use it in GitHub Desktop.
Varnish VCL 4 - Com explicações
#Define como linguagem a versao 4.0
vcl 4.0;
# Importa as features standard
import std;
#Importa as features para Balanceamento
import directors;
# Probe serve para fazer um health check dos backends e em caso de falha não encaminha as requisições para o backend com falhas.
probe health {
# Url de consulta, padrao eh "/"
# .url = "/";
# Especifica uma requisicao completa de HTTP usando multiplas strings
.request =
"HEAD / HTTP/1.1"
"Host: homolog.opac.scielo.org"
"Connection: close"
"User-Agent: Varnish Health Probe";
# Codigo HTTP esperado. padrao eh 200.
.expected_response = 200;
# Tempo de TimeOut para o Probe
.timeout = 3s;
# Frequencia que o probe faz a checagem
.interval = 30s;
# Quantas pesquisas para testar a saude do backend
.window =5;
# Se 3 tiverem sucesso eu considero o backend saudevel
.threshold = 3;
}
backend lb01opac {
.host = "192.168.1.60";
.port = "56889";
.probe = health;
}
backend lb02opac {
.host = "192.168.1.61";
.port = "56889";
.probe = health;
}
sub vcl_init {
new round_robin_director = directors.round_robin();
round_robin_director.add_backend(lb01opac);
round_robin_director.add_backend(lb02opac);
}
sub vcl_recv {
# Regra de X-Forwarded-For
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.url ~ "^/admin") {
return (pass);
}
# Exemplo de redirect na requisição pelo browser
# if (req.url ~ "^/set_locale/pt_BR") {
# return (synth(301, "https://uol.com.br"));
# }
# if (req.url ~ "^/set_locale/es") {
# return (synth(301, "https://cnnespanol.cnn.com/"));
# }
# if (req.url ~ "^/set_locale/en") {
# return (synth(301, "http://edition.cnn.com/"));
# }
# Regra geral para fazer cache de requisicoes GET e HEAD
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
return (hash);
}
# FUNCIONA CACHE MAS SEM MUDANÇA DE IDIOMA
sub vcl_backend_response {
## Regras de Bypass
if (bereq.url ~ "^/admin") {
return (deliver);
}
if (bereq.url ~ "^/set_locale/pt_BR") {
return (deliver);
}
if (bereq.url ~ "^/set_locale/es") {
return (deliver);
}
if (bereq.url ~ "^/set_locale/en") {
return (deliver);
}
unset beresp.http.expires;
set beresp.http.cache-control = "max-age=900";
set beresp.ttl = 168h;
unset beresp.http.Server;
set beresp.http.Server = "nginx";
return (deliver);
}
# CACHE DUVIDOSO, MAS FUNCIONA A TROCA DE IDIOMA
# Regras explicadas pelo Juan
#sub vcl_backend_response {
# Regras de Bypass
# if (bereq.url ~ "^/admin") {
# return (deliver);
# }
# if (beresp.ttl <= 0s ||
# beresp.http.Set-Cookie ||
# beresp.http.Surrogate-control ~ "no-store" ||
# (!beresp.http.Surrogate-Control &&
# beresp.http.Cache-Control ~ "no-cache|no-store|private") ||
# beresp.http.Vary == "*") {
# /*
# * Mark as "Hit-For-Pass" for the next 2 minutes
# */
# set beresp.ttl = 120s;
# set beresp.uncacheable = true;
#
# } else {
# set beresp.grace = 1h;
#/* Remove Expires from backend, it's not long enough */
# unset beresp.http.expires;
#/* Defina o TTL do client para este objeto */
# # set beresp.http.cache-control = "max-age=900";
#/* Tempo de retencao de um cache */
# set beresp.ttl = 168h;
#/* Unset Apache sends a Server header such as Server: nginx and set other header */
# unset beresp.http.Server;
# set beresp.http.Server = "nginx";
# }
# return (deliver);
#}
# ESTUDO PARA CONCILIAR CACHE E MUDANCA DE IDIOMA
#sub vcl_backend_response {
# Regras de Bypass
# if (bereq.url ~ "^/admin") {
# return (deliver);
# }
# if (beresp.ttl <= 0s ||
# beresp.http.Set-Cookie ||
# beresp.http.Surrogate-control ~ "no-store" ||
# (!beresp.http.Surrogate-Control &&
# beresp.http.Cache-Control ~ "no-cache|no-store|private") ||
# beresp.http.Vary == "*") {
# /*
# * Mark as "Hit-For-Pass" for the next 2 minutes
# */
# set beresp.ttl = 120s;
# set beresp.uncacheable = true;
# } else
# if (bereq.url ~ "^/set_locale" && beresp.http.set-cookie){
# set beresp.ttl = 120s;
# set beresp.uncacheable = true;
# set beresp.http.X-Burg = "CAI";
# }
# set beresp.grace = 1h;
# unset beresp.http.expires;
# set beresp.http.cache-control = "max-age=900";
# set beresp.ttl = 168h;
# unset beresp.http.Server;
# set beresp.http.Server = "nginx";
# #}
# return (deliver);
#}
# The data on which the hashing will take place
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
# Configuracao de Redirect quando vem resposta do Servidor
if (resp.status == 302 && req.url ~ "^/set_locale/pt_BR") {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
set resp.http.X-Deliver = "HIT";
# return (synth(301, "https://uol.com.br"));
# return (synth(301, "https://homolog.opac.scielo.org/set_locale/pt_BR"));
return(deliver);
}
if (resp.status == 302 && req.url ~ "^/set_locale/es") {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
set resp.http.X-Deliver = "HIT";
# return (synth(301, "https://cnnespanol.cnn.com/"));
# return (synth(301, "https://homolog.opac.scielo.org/set_locale/es"));
return(deliver);
}
if (resp.status == 302 && req.url ~ "^/set_locale/en") {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
set resp.http.X-Deliver = "HIT";
# return (synth(301, "http://edition.cnn.com/"));
# return (synth(301, "https://homolog.opac.scielo.org/set_locale/en"));
return(deliver);
}
# unset resp.http.X-Powered-By;
return (deliver);
}
sub vcl_synth {
if (resp.status == 301) {
set resp.http.location = resp.reason;
set resp.reason = "Moved";
return (deliver);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment