Este documento proporciona una introducción a varias formas de mejorar el rendimiento y funcionalidad de Varnish mediante el uso de módulos (vmods). Algunos vmods descritos incluyen cURL para realizar peticiones HTTP, OpenDDR y dClass para la detección de dispositivos, y módulos para autenticación, ordenamiento de parámetros de consulta, reducción de E/S de disco, detección geográfica, firewalling y el uso de Memcached y Redis.
12. Calentar caché
• Purge + Restart
sub vcl_hit { # y vcl_miss()
if (req.request == "PURGE") {
purge;
set req.request = "GET";
set req.http.X-purger = "Purged";
error 800 "restart";
# set req-backend = SuperServer;
# return(restart);
}
}
https://www.varnish-software.com/static/book/Saving_a_request.html#solution-combinepurge-and-restart
13. Detección de dispositivos
OpenDDR
+
dClass
Open Device
Description
Repository
Dtree Pattern
Classification
Engine
https://www.varnish-cache.org/vmod/dclass-apache-devicemap
https://github.com/OpenDDRdotORG/OpenDDR-Resources
14. Detección de dispositivos
set req.http.dclass_openddr =
dclass.classify(req.http.user-agent);
if (dclass.get_field("is_tablet") == "true"){
set req.http.dclass_type = "tablet";
}
else if (
dclass.get_field("is_wireless_device") == "true" &&
dclass.get_field("inputDevices") == "touchscreen"){
set req.http.dclass_type = "smartphone";
}
15. Detección de dispositivos
sub vcl_recv() {
if (req.http.Cookie ~ "^X-device=") {
# do the magic
}
}
sub vcl_fetch() {
set obj.http.Set-Cookie = "X-device=" +
req.http.dclass_type; domain=.example.com;
path=/";
}
16. Detección de dispositivos
Fabricante
Modelo
Ancho y alto de pantalla
Inputs (táctil, teclado, etc)
Soporte de Javascript
Si es wireless / tablet / crawler / desktop
Navegador, nombre y versión
Sistema operativo
17. Geo IP
Fijar conexión a servidores locales
Estúpida ley de cookies europea
Restricciones copyright por países
Tres implementaciones
La de Cosimo (Opera) permite nivel de
ciudad
https://github.com/leed25d/geoip-vmod
https://github.com/lampeh/libvmod-geoip
https://github.com/cosimo/varnish-geoip
18. Firewall varnish
Usa otros vmods
ParseReq
Shield
Throttle
UrlEncode
Basado en mod_security
Backend-less: mejor no
mezclar con la lógica de caché
https://github.com/comotion/VSF
24. Autentificación con htpassw
Fichero con estructura htpassw usando md5
o sha1 (no es necesario apache)
import basicauth;
sub vcl_recv {
if (!basicauth.match("/var/www/.htpasswd",
req.http.Authorization)) {
error 401 "Authentication required";
}
}
27. Reducir I/O de disco
“Si usas la RAM como almacén, todo Varnish
funciona en memoria”
SHM
¡NO!
28. Reducir I/O de disco
Shared Memory Log en /var/lib/varnish
Junto con los .so de los vcls que hayas cargado
~ 80 MB
/etc/fstab
tmpfs /var/lib/varnish tmpfs rw,size=128M 0 0
Si tienes SSDs no hace falta
https://www.varnish-software.com/static/book/Tuning.html#the-shared-memory-log
30. Proxys y Akamai
Varnish 3 no transforma string en IP
ipcast.clientip(req.http.X-Forwarded-For);
ipcast.clientip(req.http.True-Client-IP);
ipcast.clientip("192.168.0.10");
ipcast.clientip("2001:db8::1");
https://github.com/lkarsten/libvmod-ipcast
33. Imágenes
Si tienes CDN ¿para qué cacheas los estáticos?
Si no tienes CDN ¿para qué cacheas los estáticos?
Apache 2.4 puede ser suficiente
OMFG!!!11one!!
Ban.nuke crece sin cesar
35. Longtail
sub vcl_fetch() {
if (req.url ~ "^/archivo/20(0[1-9]|1[0-2])"
&& beresp.ttl > 0s ) {
unset beresp.http.expires;
set beresp.http.cache-control = "max-age=604800";
set beresp.ttl = 2w; // varnish ttl
set beresp.storage = "disco";
} else {
set beresp.storage = "memoria";
}
}
https://www.varnish-cache.org/trac/wiki/VCLExampleLongerCaching
36. Sitio en mantenimiento
Poner el sitio en mantenimiento puede ser
una locura, avisa a Varnish de ello.
Dos acercamientos:
• Devolver todo lo que aún en caché y dar
mensaje en lo que no esté en caché.
• Dar un mensaje de mantenimiento
37. Varnish Bans Manager
Varnish Administration Console
Gestor de bans libre
Hecho en A Coruña por dot2code
https://github.com/dot2code/varnish-bans-manager
42. Memcached y Redis
Lectura y escritura en Memcached
Lectura y escritura en Redis (soporte completo)
https://www.varnish-cache.org/vmod/memcached
https://github.com/zephirworks/libvmod-redis
43. Memcached y redis
Estadísticas
if (memcached.incr("node-1234", 1)) {
// set(STRING key, STRING value, INT expiration, INT flags)
memcached.set("node-1234", "1", 0, 0);
}
Recoger bloques
set resp.http.block-123 = memcached.get("block-123");