X

Cómo instalar Varnish en CentOS

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/

Artículos relacionados