Esta es una oportunidad este artículo es sobre la instalación de Varnish caché en CentOS 6.3 de 64 bits, el mismo funciona como un servidor web para cachear peticiones HTTP (Cache proxy inverso). Con Varnish Cache se puede aumentar la velocidad de una aplicación web por 300 – 1000 veces cuando se utiliza correctamente en la arquitectura adecuada.
Ahora vamos con la forma correcta de instalar Varnish Cache en Centos 6.3 64 Bits, lo primero que instalamos son su dependencias.
bash-shell# yum install -y gcc make automake autoconf libtool ncurses-devel libxslt groff pcre-devel pckgconfig libedit libedit-devel
Ahora traemos la versión estable desde desde el repositorio oficial de Varnish
bash-shell# wget http://repo.varnish-cache.org/source/varnish-3.0.5.tar.gz
Extraemos y compilamos el código para poder crear el binario del servicio Varnish
bash-shell# gunzip -c varnish-3.0.5.tar.gz | tar -xvf - bash-shell# cd varnish-3.0.5 bash-shell# ./autogen.sh bash-shell# ./configure bash-shell# make bash-shell# make check bash-shell# make install
La configuración de Varnish como parte principal del demonio se encuentra en este archivo
nano -w /etc/sysconfig/varnish
Ahora podemos ver toda la configuración, una variable importante es VARNISH_LISTEN_PORT en donde se define el puerto de nuestro servicio Varnish, que en este caso vamos a trabajar con el puerto 80.
# Varnish Users VARNISH_RUN_USER=varnish VARNISH_RUN_GROUP=varnish # Should we start varnishd at boot? Set to "yes" to enable. START=yes # Maximum number of open files (for ulimit -n) # NFILES=131072 # Locked shared memory (for ulimit -l) # Default log size is 82MB + header MEMLOCK=82000 # # Maximum number of threads (for ulimit -u) NPROCS="unlimited" # # Maximum size of corefile (for ulimit -c). Default in Fedora is 0 DAEMON_COREFILE_LIMIT="unlimited" RELOAD_VCL=1 # Should probably change this VARNISH_VCL_CONF=/etc/varnish/default.vcl # Not setting VARNISH_LISTEN_ADDRESS makes Varnish listen on all IPs on this box # (Both IPv4 and IPv6 if available). Set manually to override this. # VARNISH_LISTEN_ADDRESS= VARNISH_LISTEN_PORT=80 # Telnet admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 VARNISH_ADMIN_LISTEN_PORT=6082 # Shared secret file for admin interface VARNISH_SECRET_FILE=/etc/varnish/secret # The minimum number of worker threads to start VARNISH_MIN_THREADS=50 # The Maximum number of worker threads to start VARNISH_MAX_THREADS=5000 # Idle timeout for worker threads VARNISH_THREAD_TIMEOUT=120 # Best option is malloc if you can. malloc will make use of swap space smartly if # you have it and need it. VARNISH_STORAGE_TYPE=malloc # Cache file size: in bytes, optionally using k / M / G / T suffix, # or in percentage of available disk space using the % suffix. VARNISH_STORAGE_SIZE=128M VARNISH_STORAGE="${VARNISH_STORAGE_TYPE},${VARNISH_STORAGE_SIZE}" # Default TTL used when the backend does not specify one VARNISH_TTL=60 # DAEMON_OPTS is used by the init script. If you add or remove options, make # sure you update this section, too. DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u ${VARNISH_RUN_USER} -g ${VARNISH_RUN_GROUP} \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE}"
Ahora bien, para configurar por ejemplo nuestro WordPress, la configuración se encuentra en el siguiente archivo /usr/local/etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; .port = "8080"; } acl purge { "localhost"; } sub vcl_recv { if (req.request == "BAN") { if(!client.ip ~ purge) { error 405 "Not allowed."; } ban("req.url ~ "+req.url+" && req.http.host == "+req.http.host); error 200 "Banned."; } if (req.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE") { return (pipe); } if (req.request != "GET" && req.request != "HEAD") { return (pass); } # don't cache authenticated sessions if (req.http.Cookie && req.http.Cookie ~ "(wordpress_|PHPSESSID)") { return(pass); } # don't cache ajax requests if(req.http.X-Requested-With == "XMLHttpRequest" || req.url ~ "nocache" || req.url ~ "(control.php|wp-comments-post.php|wp-login.php|bb-login.php|bb-reset-password.php|register.php)") { return (pass); } if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") { return (pass); } remove req.http.cookie; return (lookup); } sub vcl_fetch { if (beresp.status == 404) { set beresp.ttl = 0m; return(hit_for_pass); } if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") { return (hit_for_pass); } set beresp.ttl = 24h; return (deliver); }
Con esto podemos tener nuestro servicio de Varnish en nuestro servidor, ahora bien para que no cree conflicto con nuestro servidor web actual, necesitamos cambiar en nuestro Apache / Nginx el puerto 80 por cualquier otro que queramos, en este caso hemos definido nuestro backend en el puerto 8080. Ya con esta configuración podemos iniciar nuestro servicio de Varnish.
sudo service varnish restart varnishstat
Vídeo de como funciona Varnish Cache
Web del proyecto https://www.varnish-cache.org/