SlideShare uma empresa Scribd logo
1 de 44
Baixar para ler offline
Varnish
para meros mortales
#DrupalCampES
Sobre mí
Martín González Robles
@mgzrobles
Responsable técnico de
idealista/news
Recursos
● Varnish Cache Website
https://www.varnish-cache.org/
● The Varnish Book for Varnish 4.0
http://book.varnish-software.com/4.0/
● Sácale partido a Varnish - Rodrigo Alfaro - DCampES2013
https://vimeo.com/81136713
Índice
1. ¿Qué es varnish?
2. Flujo de una petición
3. Tips and tricks
4. Médico de familia
5. Drupal & Varnish
¿Qué es Varnish?
Client Side
Backend Side
https://www.varnish-cache.org/docs/trunk/reference/states.html
Varnish Cache es un acelerador de
aplicaciones web.
Se sitúa delante de nuestro servidor HTTP y
almacena una copia de la petición solicitada.
Se suele usar como balanceador.
Flujo de una petición
Términos
VCL - Varnish Configuration Language
Hit vs Miss
TTL - Time To Live
ACL - Access Control List
Comienzo del VCL
vcl 4.0;
import std;
import directors;
include "/etc/varnish/site.vcl";
...
acl localnetwork {
"localhost";
"192.168.1.0"/24; /* and everyone on the local network */
! "192.168.1.23"; /* except for the dialin router */
}
...
sub vcl_init {
vcl_recv
Principio de la petición. Trabajaremos con el objeto “req”.
Tareas:
● Decidir si hacer una redirección
● Seleccionar backend - Balanceo
● Comprobar accesos
● Marcar como “static” o “anonimizar” una request
● Normalizar URLs
● No cachear una petición
vcl_recv ## REDIRECCIONES ##
if (req.url ~ "^/foo.*") {
set req.url = regsub(req.url, "^/foo(.*)", "/bar1");
return (synth(301, "http://" + req.http.host + req.url));
}
## SELECCION BACKEND ##
# Directors
set req.backend_hint = bar.backend();
# Backend específico por algún motivo
if (req.url ~ "^/url-muy-lenta$") {
set req.backend = my_backend_longwait;
}
https://www.varnish-cache.org/docs/4.0/users-guide/vcl-backends.html
vcl_recv
## ACCESSO ##
if (req.url ~ "/(?:cron|install|update).php") {
if (client.ip ~ localnetwork) {
return (pipe);
} else {
return (synth(404, "Page not found."));
}
## QUITAR COOKIES ##
if ( req.url ~ "^/sites/files/"
|| req.url ~ "^/(.*)[?|&]amp(.*)" ) {
unset req.http.Cookie;
}
vcl_recv ## NORMALIZAR URL ##
if (req.http.host ~ "(?i)^(www.)?dominio.com") {
set req.http.host = "dominio.com";
}
# Normalize the query arguments
set req.url = std.querysort(req.url);
# NO CACHEAR SI TIENE COOKIE DE SESIÓN
if ( req.http.Cookie ~ "SESS" ) {
return (pass);
}
vcl_hash
Aquí se generará la key para buscar y/o guardar el objeto de la
petición.
Lo más habitual será guardar una versión por url.
También podemos guardar una versión basándonos en geolocalización
(necesitaremos un vmod), o por cookie, etc.
Echémosle imaginación.
vcl_hash
sub vcl_hash {
# Drupal ddos vulnerability
hash_data(regsub(req.url, "?(.*)itok=.+[^&]", "1"));
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
if ( req.http.Cookie ) {
hash_data(req.http.Cookie);
}
return (lookup);
}
https://www.varnish-cache.org/docs/4.0/users-guide/vcl-hashing.html
http://drupalblog.torchbox.com/post/45261810748/varnish-and-drupal-72021-dos-vulnerability
● vcl_miss
○ No se ha encontrado en caché
● vcl_hit
○ Encontrado en caché
● vcl_pass
○ Enviar la petición a backend y no cachear
● vcl_backend_fetch
○ Justo antes de llamar a backend
● vcl_backend_error
○ Tratamos posibles errores desde backend y podemos reintentar la
petición.
Otras subrutinas
vcl_backend_response
Tratamos la petición devuelta desde backend.
Podemos modificar cabeceras, el tiempo de caché, habilitar
ESI
https://www.varnish-cache.org/docs/4.0/users-guide/esi.html
vcl_backend_response
sub vcl_backend_response {
// Hacia afuera dejamos 0 segundos de max-age para que esté en los navegadores.
set beresp.http.cache-control = "max-age=0";
if (beresp.http.Content-Type ~ "(image|audio|video|flash|css|javascript)") {
set beresp.http.cache-control = "max-age=1209600";
set beresp.ttl = 2w;
if (beresp.status >= 500 && beresp.status < 600) {
set beresp.http.Cache-Control = "no-cache, max-age=0, must-revalidate";
set beresp.ttl = 0s;
set beresp.uncacheable = true;
return(deliver);
}
}
vcl_deliver
Tenemos todo para mandar una respuesta al cliente.
Terminaremos de definir las cabeceras finales porque en este
punto ya no se cachearían.
También podremos terminar de componer el contenido de la
respuesta, por ejemplo para 404 o 500.
vcl_deliver
sub vcl_deliver {
if (std.ip(req.http.True-Client-IP, client.ip) ~
locales) {
if (resp.http.x-varnish ~ " ") {
set resp.http.X-cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-cache = "MISS";
}
if ( resp.status >= 500 ) {
return (synth(500, "Internal Server Error."));
}
else if (resp.status >= 400 && resp.status < 500) {
return (synth(404, "Page not found."));
}
vcl_synth
sub vcl_synth {
if (resp.status >= 500 && resp.status < 600) {
set resp.http.Content-Type = "text/html; charset=utf-8";
synthetic(std.fileread("/var/www/50x.html"));
return(deliver);
}
synthetic( {"<!DOCTYPE html>
<html>
<head>
<title>"} + resp.status + " " + resp.reason
+ {"</title>
</head>
<body>
<h1>Error "} + resp.status + " " + resp.
reason + {"</h1>
<p>"} + resp.reason + {"</p>
<h3>Guru Meditation:</h3>
<p>XID: "} + req.xid + {"</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
"} );
Se le llama para devolver un contenido
generado por el propio vcl, no por backend.
Aquí podremos personalizar las páginas 404/500.
Tips and tricks
Uso de funciones y “variables”
sub vcl_recv {
...
call redirects;
call init_custom_vars;
...
sub init_custom_vars {
if (req.http.host ~ "^localhost") {
set req.http.x-is-environment = "dev";
}
else {
set req.http.x-is-environment = "prod";
}
Podemos programar nuestras propias subroutines y llamarlas de forma sencilla.
No admiten argumentos, pero podemos “jugar” con las cabeceras.
if (bereq.http.x-is-environment == "dev")
{
set beresp.uncacheable = true;
}
“Debug” Logar eventos
Podemos escribir al syslog desde varnish.
http://martingonzalez.es/blog/logar-eventos-al-syslog-en-varnish
https://es.wikipedia.org/wiki/Syslog
import std;
sub vcl_recv {
...
std.syslog(180, "RECV: " + req.http.host + req.url);
...
}
~$ sudo tailf /var/log/syslog
Comandos útiles de varnish
Top peticiones a backend
Filtrar peticiones usando Query Language
http://book.varnish-software.com/4.0/chapters/Examining_Varnish_Server_s_Output.html#query-language
varnishtop -i BereqURL
varnishlog -q 'ReqUrl ~ "^/foo" and RespStatus > 200'
Chrome DevTools - Network
Médico de familia
Médico de familia
¿Qué pasa si nuestro backend está en mal estado?
Esto puede ser debido a muchas causas:
● Podemos tener un pico de tráfico
● Que la base de datos no responda
● Quizás falta de conexión con nuestro memcache
● El sistema de ficheros no es accesible
● O el motivo X según el caso
Médico de familia
Varnish tiene el “grace mode”, que permite devolver una
versión almacenada en caché cuando no hay ningún backend
disponible.
Médico de familia
probe healthcheck {
.request =
"GET /var/www/status.php HTTP/1.1"
"Host: www.host.com"
"Connection: close";
.interval = 10s;
.timeout = 2s;
.window = 8;
.threshold = 3;
}
backend web1 {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 100s;
.first_byte_timeout = 60s;
.between_bytes_timeout = 60s;
.max_connections = 100;
.probe = healthcheck;
}
https://www.varnish-cache.org/docs/4.0/reference/vcl.html#probes
https://www.varnish-cache.org/docs/4.0/reference/vcl.html#backend-definition
Médico de familia
<?php
register_shutdown_function('status_shutdown');
function status_shutdown() {
exit();
}
define('DRUPAL_ROOT', getcwd());
try {
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE);
} catch (PDOException $e) {
$errors[] = $prefix . "Database not responding: " . $e-
>getMessage();
}
if ($errors) {
header('HTTP/1.1 500 Internal Server Error');
error_log(implode(PHP_EOL, $errors), 0);
}
else {
header("HTTP/1.1 200 OK");
}
// Exit immediately, note the shutdown function
registered at the top of the file.
exit();
set req.http.grace = "none";
if (!std.healthy(req.backend_hint)) {
std.syslog(180, "CAIDOS: " + req.url);
unset req.http.Cookie;
return (lookup);
}
sub vcl_hit {
###
if (!std.healthy(req.backend_hint)) {
if (obj.ttl + obj.grace > 0s) {
set req.http.grace = "full";
return (deliver);
} else {
return (fetch);
}
}
vcl_recv vcl_hit
Médico de familia
https://info.varnish-software.com/blog/grace-varnish-4-stale-while-revalidate-semantics-varnish
Médico de familia
sub vcl_backend_response {
set beresp.ttl = 10s;
set beresp.grace = 6h;
}
sub vcl_deliver {
set resp.http.grace = req.http.grace;
}
Drupal & Varnish
Invalidación de caché
function MY_MODULE_expire_urls_alter(&$urls, $object_type, $object) {
if (!empty($object->type)) {
if ($object->type === 'article' && node_is in_front($object)) {
$urls['front'] = url('<front>', array('absolute' => TRUE, 'alias' => TRUE));
}
}
Expire + Varnish
https://www.drupal.org/project/expire + https://www.drupal.org/project/varnish
Invalidación de caché
$view = views_get_view('front');
$view->set_display('page');
$cache = $view->display_handler->get_plugin('cache');
cache_clear_all($base . $alias, 'cache_page');
$cache->cache_flush();
Invalidación de caché
$req_url = ‘/foo’;
$host = _varnish_get_host();
varnish_purge($host, '^' . $req_url . '$');
$curl = curl_init("http://varnish-localhost/foo");
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PURGE");
curl_exec($curl);
Drupal
PHP - cURL
~$ CURL -X PURGE "http://varnish-localhost/foo"
~$ sudo varnishadm
varnish> ban req.url ~ “^/foo”
varnishadm
Shell cURL
Próximamente...
Release Varnish 5
Septiembre de 2016
Soporte para HTTP/2
Release party
¿Preguntas?
¡Gracias!

Mais conteúdo relacionado

Mais procurados

Pentaho BI
Pentaho BIPentaho BI
Pentaho BIT.I.C
 
LSWC PostgreSQL 9.1 (2011)
LSWC PostgreSQL 9.1 (2011)LSWC PostgreSQL 9.1 (2011)
LSWC PostgreSQL 9.1 (2011)Emanuel Calvo
 
Aprendiendo REDIS en 20 minutos
Aprendiendo REDIS en 20 minutosAprendiendo REDIS en 20 minutos
Aprendiendo REDIS en 20 minutosGonzalo Chacaltana
 
Desarrollo de sistios web
Desarrollo de sistios webDesarrollo de sistios web
Desarrollo de sistios webesmartcrimt
 
Pl 08-aplicacion-en-php-my sql
Pl 08-aplicacion-en-php-my sqlPl 08-aplicacion-en-php-my sql
Pl 08-aplicacion-en-php-my sqlNoé Arpasi
 
Aspnet40 Cache Extensibility
Aspnet40 Cache ExtensibilityAspnet40 Cache Extensibility
Aspnet40 Cache ExtensibilityChristian Strevel
 
Taller Redis
Taller RedisTaller Redis
Taller Redisbetabeers
 
Manual ldap
Manual ldapManual ldap
Manual ldapomarhl2
 
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...Adrián Lois
 
Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Ciencias
 

Mais procurados (14)

Servicios web
Servicios webServicios web
Servicios web
 
Pentaho BI
Pentaho BIPentaho BI
Pentaho BI
 
LSWC PostgreSQL 9.1 (2011)
LSWC PostgreSQL 9.1 (2011)LSWC PostgreSQL 9.1 (2011)
LSWC PostgreSQL 9.1 (2011)
 
Servicios web
Servicios webServicios web
Servicios web
 
Servicios web
Servicios webServicios web
Servicios web
 
Aprendiendo REDIS en 20 minutos
Aprendiendo REDIS en 20 minutosAprendiendo REDIS en 20 minutos
Aprendiendo REDIS en 20 minutos
 
Desarrollo de sistios web
Desarrollo de sistios webDesarrollo de sistios web
Desarrollo de sistios web
 
Pl 08-aplicacion-en-php-my sql
Pl 08-aplicacion-en-php-my sqlPl 08-aplicacion-en-php-my sql
Pl 08-aplicacion-en-php-my sql
 
Aspnet40 Cache Extensibility
Aspnet40 Cache ExtensibilityAspnet40 Cache Extensibility
Aspnet40 Cache Extensibility
 
Taller Redis
Taller RedisTaller Redis
Taller Redis
 
Manual ldap
Manual ldapManual ldap
Manual ldap
 
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...
Implementación Docker Swarm en Amazon Web Services usando Auto Scaling Groups...
 
Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3Instalacion de Pentaho 5 con PostgreSQL 9.3
Instalacion de Pentaho 5 con PostgreSQL 9.3
 
Cherokee
CherokeeCherokee
Cherokee
 

Semelhante a Varnish para meros mortales

PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfRaaulroodriguez
 
Curso de Desarrollo Web de Platzi
Curso de Desarrollo Web de PlatziCurso de Desarrollo Web de Platzi
Curso de Desarrollo Web de PlatziCarlos Azaustre
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Asier Marqués
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvmsuperserch
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSPousli07
 
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesLa Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesNextel S.A.
 
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesLa Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesPablo Garaizar
 
Php07 consultas bd
Php07 consultas bdPhp07 consultas bd
Php07 consultas bdJulio Pari
 
Servicios web en Java, PHP, Perl y Google
Servicios web en Java, PHP, Perl y GoogleServicios web en Java, PHP, Perl y Google
Servicios web en Java, PHP, Perl y GoogleArmando Nuñez Ramos
 
Aplicar la seguridad en WordPress desde la selección de un hosting
Aplicar la seguridad en WordPress desde la selección de un hosting Aplicar la seguridad en WordPress desde la selección de un hosting
Aplicar la seguridad en WordPress desde la selección de un hosting José Conti Calveras
 
Apache: instalación y configuración en Ubuntu Server y Windows Server
Apache: instalación y configuración en Ubuntu Server y Windows ServerApache: instalación y configuración en Ubuntu Server y Windows Server
Apache: instalación y configuración en Ubuntu Server y Windows ServerNombre Apellidos
 

Semelhante a Varnish para meros mortales (20)

Webperf wordpress
Webperf wordpressWebperf wordpress
Webperf wordpress
 
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
 
Curso de Desarrollo Web de Platzi
Curso de Desarrollo Web de PlatziCurso de Desarrollo Web de Platzi
Curso de Desarrollo Web de Platzi
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.
 
04. Implementando APIs HTML5
04. Implementando APIs HTML5 04. Implementando APIs HTML5
04. Implementando APIs HTML5
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvm
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSP
 
Curso de php
Curso de phpCurso de php
Curso de php
 
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesLa Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
 
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidadesLa Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
La Web como plataforma de referencia: viejos ataques y nuevas vulnerabilidades
 
Php07 consultas bd
Php07 consultas bdPhp07 consultas bd
Php07 consultas bd
 
Nginx
NginxNginx
Nginx
 
1212
12121212
1212
 
Servicios web en Java, PHP, Perl y Google
Servicios web en Java, PHP, Perl y GoogleServicios web en Java, PHP, Perl y Google
Servicios web en Java, PHP, Perl y Google
 
Php!
Php!Php!
Php!
 
Carlos Pascual #WPvalladolid 2014
Carlos Pascual #WPvalladolid 2014Carlos Pascual #WPvalladolid 2014
Carlos Pascual #WPvalladolid 2014
 
Entorno PHP
Entorno PHPEntorno PHP
Entorno PHP
 
Aplicar la seguridad en WordPress desde la selección de un hosting
Aplicar la seguridad en WordPress desde la selección de un hosting Aplicar la seguridad en WordPress desde la selección de un hosting
Aplicar la seguridad en WordPress desde la selección de un hosting
 
Curso de HTML5
Curso de HTML5Curso de HTML5
Curso de HTML5
 
Apache: instalación y configuración en Ubuntu Server y Windows Server
Apache: instalación y configuración en Ubuntu Server y Windows ServerApache: instalación y configuración en Ubuntu Server y Windows Server
Apache: instalación y configuración en Ubuntu Server y Windows Server
 

Último

TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 

Último (20)

TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 

Varnish para meros mortales

  • 2. Sobre mí Martín González Robles @mgzrobles Responsable técnico de idealista/news
  • 3. Recursos ● Varnish Cache Website https://www.varnish-cache.org/ ● The Varnish Book for Varnish 4.0 http://book.varnish-software.com/4.0/ ● Sácale partido a Varnish - Rodrigo Alfaro - DCampES2013 https://vimeo.com/81136713
  • 4. Índice 1. ¿Qué es varnish? 2. Flujo de una petición 3. Tips and tricks 4. Médico de familia 5. Drupal & Varnish
  • 7. Varnish Cache es un acelerador de aplicaciones web. Se sitúa delante de nuestro servidor HTTP y almacena una copia de la petición solicitada. Se suele usar como balanceador.
  • 8. Flujo de una petición
  • 9.
  • 10. Términos VCL - Varnish Configuration Language Hit vs Miss TTL - Time To Live ACL - Access Control List
  • 11. Comienzo del VCL vcl 4.0; import std; import directors; include "/etc/varnish/site.vcl"; ... acl localnetwork { "localhost"; "192.168.1.0"/24; /* and everyone on the local network */ ! "192.168.1.23"; /* except for the dialin router */ } ... sub vcl_init {
  • 12. vcl_recv Principio de la petición. Trabajaremos con el objeto “req”. Tareas: ● Decidir si hacer una redirección ● Seleccionar backend - Balanceo ● Comprobar accesos ● Marcar como “static” o “anonimizar” una request ● Normalizar URLs ● No cachear una petición
  • 13. vcl_recv ## REDIRECCIONES ## if (req.url ~ "^/foo.*") { set req.url = regsub(req.url, "^/foo(.*)", "/bar1"); return (synth(301, "http://" + req.http.host + req.url)); } ## SELECCION BACKEND ## # Directors set req.backend_hint = bar.backend(); # Backend específico por algún motivo if (req.url ~ "^/url-muy-lenta$") { set req.backend = my_backend_longwait; } https://www.varnish-cache.org/docs/4.0/users-guide/vcl-backends.html
  • 14. vcl_recv ## ACCESSO ## if (req.url ~ "/(?:cron|install|update).php") { if (client.ip ~ localnetwork) { return (pipe); } else { return (synth(404, "Page not found.")); } ## QUITAR COOKIES ## if ( req.url ~ "^/sites/files/" || req.url ~ "^/(.*)[?|&]amp(.*)" ) { unset req.http.Cookie; }
  • 15. vcl_recv ## NORMALIZAR URL ## if (req.http.host ~ "(?i)^(www.)?dominio.com") { set req.http.host = "dominio.com"; } # Normalize the query arguments set req.url = std.querysort(req.url); # NO CACHEAR SI TIENE COOKIE DE SESIÓN if ( req.http.Cookie ~ "SESS" ) { return (pass); }
  • 16. vcl_hash Aquí se generará la key para buscar y/o guardar el objeto de la petición. Lo más habitual será guardar una versión por url. También podemos guardar una versión basándonos en geolocalización (necesitaremos un vmod), o por cookie, etc. Echémosle imaginación.
  • 17. vcl_hash sub vcl_hash { # Drupal ddos vulnerability hash_data(regsub(req.url, "?(.*)itok=.+[^&amp;]", "1")); if (req.http.host) { hash_data(req.http.host); } else { hash_data(server.ip); } if ( req.http.Cookie ) { hash_data(req.http.Cookie); } return (lookup); } https://www.varnish-cache.org/docs/4.0/users-guide/vcl-hashing.html http://drupalblog.torchbox.com/post/45261810748/varnish-and-drupal-72021-dos-vulnerability
  • 18. ● vcl_miss ○ No se ha encontrado en caché ● vcl_hit ○ Encontrado en caché ● vcl_pass ○ Enviar la petición a backend y no cachear ● vcl_backend_fetch ○ Justo antes de llamar a backend ● vcl_backend_error ○ Tratamos posibles errores desde backend y podemos reintentar la petición. Otras subrutinas
  • 19. vcl_backend_response Tratamos la petición devuelta desde backend. Podemos modificar cabeceras, el tiempo de caché, habilitar ESI https://www.varnish-cache.org/docs/4.0/users-guide/esi.html
  • 20. vcl_backend_response sub vcl_backend_response { // Hacia afuera dejamos 0 segundos de max-age para que esté en los navegadores. set beresp.http.cache-control = "max-age=0"; if (beresp.http.Content-Type ~ "(image|audio|video|flash|css|javascript)") { set beresp.http.cache-control = "max-age=1209600"; set beresp.ttl = 2w; if (beresp.status >= 500 && beresp.status < 600) { set beresp.http.Cache-Control = "no-cache, max-age=0, must-revalidate"; set beresp.ttl = 0s; set beresp.uncacheable = true; return(deliver); } }
  • 21. vcl_deliver Tenemos todo para mandar una respuesta al cliente. Terminaremos de definir las cabeceras finales porque en este punto ya no se cachearían. También podremos terminar de componer el contenido de la respuesta, por ejemplo para 404 o 500.
  • 22. vcl_deliver sub vcl_deliver { if (std.ip(req.http.True-Client-IP, client.ip) ~ locales) { if (resp.http.x-varnish ~ " ") { set resp.http.X-cache = "HIT"; set resp.http.X-Cache-Hits = obj.hits; } else { set resp.http.X-cache = "MISS"; } if ( resp.status >= 500 ) { return (synth(500, "Internal Server Error.")); } else if (resp.status >= 400 && resp.status < 500) { return (synth(404, "Page not found.")); }
  • 23. vcl_synth sub vcl_synth { if (resp.status >= 500 && resp.status < 600) { set resp.http.Content-Type = "text/html; charset=utf-8"; synthetic(std.fileread("/var/www/50x.html")); return(deliver); } synthetic( {"<!DOCTYPE html> <html> <head> <title>"} + resp.status + " " + resp.reason + {"</title> </head> <body> <h1>Error "} + resp.status + " " + resp. reason + {"</h1> <p>"} + resp.reason + {"</p> <h3>Guru Meditation:</h3> <p>XID: "} + req.xid + {"</p> <hr> <p>Varnish cache server</p> </body> </html> "} ); Se le llama para devolver un contenido generado por el propio vcl, no por backend. Aquí podremos personalizar las páginas 404/500.
  • 25. Uso de funciones y “variables” sub vcl_recv { ... call redirects; call init_custom_vars; ... sub init_custom_vars { if (req.http.host ~ "^localhost") { set req.http.x-is-environment = "dev"; } else { set req.http.x-is-environment = "prod"; } Podemos programar nuestras propias subroutines y llamarlas de forma sencilla. No admiten argumentos, pero podemos “jugar” con las cabeceras. if (bereq.http.x-is-environment == "dev") { set beresp.uncacheable = true; }
  • 26. “Debug” Logar eventos Podemos escribir al syslog desde varnish. http://martingonzalez.es/blog/logar-eventos-al-syslog-en-varnish https://es.wikipedia.org/wiki/Syslog import std; sub vcl_recv { ... std.syslog(180, "RECV: " + req.http.host + req.url); ... } ~$ sudo tailf /var/log/syslog
  • 27. Comandos útiles de varnish Top peticiones a backend Filtrar peticiones usando Query Language http://book.varnish-software.com/4.0/chapters/Examining_Varnish_Server_s_Output.html#query-language varnishtop -i BereqURL varnishlog -q 'ReqUrl ~ "^/foo" and RespStatus > 200'
  • 28. Chrome DevTools - Network
  • 30. Médico de familia ¿Qué pasa si nuestro backend está en mal estado? Esto puede ser debido a muchas causas: ● Podemos tener un pico de tráfico ● Que la base de datos no responda ● Quizás falta de conexión con nuestro memcache ● El sistema de ficheros no es accesible ● O el motivo X según el caso
  • 31. Médico de familia Varnish tiene el “grace mode”, que permite devolver una versión almacenada en caché cuando no hay ningún backend disponible.
  • 32. Médico de familia probe healthcheck { .request = "GET /var/www/status.php HTTP/1.1" "Host: www.host.com" "Connection: close"; .interval = 10s; .timeout = 2s; .window = 8; .threshold = 3; } backend web1 { .host = "127.0.0.1"; .port = "8080"; .connect_timeout = 100s; .first_byte_timeout = 60s; .between_bytes_timeout = 60s; .max_connections = 100; .probe = healthcheck; } https://www.varnish-cache.org/docs/4.0/reference/vcl.html#probes https://www.varnish-cache.org/docs/4.0/reference/vcl.html#backend-definition
  • 33. Médico de familia <?php register_shutdown_function('status_shutdown'); function status_shutdown() { exit(); } define('DRUPAL_ROOT', getcwd()); try { require_once DRUPAL_ROOT . '/includes/bootstrap.inc'; drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE); } catch (PDOException $e) { $errors[] = $prefix . "Database not responding: " . $e- >getMessage(); } if ($errors) { header('HTTP/1.1 500 Internal Server Error'); error_log(implode(PHP_EOL, $errors), 0); } else { header("HTTP/1.1 200 OK"); } // Exit immediately, note the shutdown function registered at the top of the file. exit();
  • 34. set req.http.grace = "none"; if (!std.healthy(req.backend_hint)) { std.syslog(180, "CAIDOS: " + req.url); unset req.http.Cookie; return (lookup); } sub vcl_hit { ### if (!std.healthy(req.backend_hint)) { if (obj.ttl + obj.grace > 0s) { set req.http.grace = "full"; return (deliver); } else { return (fetch); } } vcl_recv vcl_hit Médico de familia https://info.varnish-software.com/blog/grace-varnish-4-stale-while-revalidate-semantics-varnish
  • 35. Médico de familia sub vcl_backend_response { set beresp.ttl = 10s; set beresp.grace = 6h; } sub vcl_deliver { set resp.http.grace = req.http.grace; }
  • 36.
  • 38. Invalidación de caché function MY_MODULE_expire_urls_alter(&$urls, $object_type, $object) { if (!empty($object->type)) { if ($object->type === 'article' && node_is in_front($object)) { $urls['front'] = url('<front>', array('absolute' => TRUE, 'alias' => TRUE)); } } Expire + Varnish https://www.drupal.org/project/expire + https://www.drupal.org/project/varnish
  • 39. Invalidación de caché $view = views_get_view('front'); $view->set_display('page'); $cache = $view->display_handler->get_plugin('cache'); cache_clear_all($base . $alias, 'cache_page'); $cache->cache_flush();
  • 40. Invalidación de caché $req_url = ‘/foo’; $host = _varnish_get_host(); varnish_purge($host, '^' . $req_url . '$'); $curl = curl_init("http://varnish-localhost/foo"); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PURGE"); curl_exec($curl); Drupal PHP - cURL ~$ CURL -X PURGE "http://varnish-localhost/foo" ~$ sudo varnishadm varnish> ban req.url ~ “^/foo” varnishadm Shell cURL
  • 42. Release Varnish 5 Septiembre de 2016 Soporte para HTTP/2 Release party