Mejorando la velocidad de Alfresco con Varnish

En la charla que di en el Meetup de Alfresco en Madrid, comenté, entre otras cosas, cómo acelerar Alfresco, en este punto se hablaba de Varnish.

Varnish

Varnish es un proxy caché, acelerador web y balanceador de servidores web que funciona sobre Linux, Mac y *BSD, básicamente usa opciones del kernel y un almacén de la caché para acelerar las peticiones de páginas, es decir, un sustituto a mod_proxy, mod_proxy_balancer o mod_proxy_ajp.

En este artículo os dejo un manual sobre como implementar Varnish por delante de Alfresco para acelerar la experiencia del usuario y funcionamiento en general de la aplicación, tanto Alfresco Explorer como Alfresco Share u otras aplicaciones que desarrollemos sobre Alfresco, reduce los tiempos de conexión de forma considerable y libera de algunas peticiones al servidor de aplicaciones.

En este caso explicaré como instalar y configurar Varnish 2.0.5 en CentOS 5 mediante un RPM aunque también se puede compilar, todo en menos de 5 minutos. La lectura de esta web me ha ayudado para escribir el artículo.

En caso de no usar CentOS, RedHat o derivados, puedes descargar y compilar la versión 2.0.5 de aquí:

# tar zxvf varnish-2.0.5.tar.gz
# cd varnish-2.0.5
# more README
# more INSTALL
# ./configure
# make
# make install

En este caso los archivos de configuración los encontrarás en /usr/local/etc y deberás hacer tus propios scirpts de arranque, parada, etc.

El resto del artículo contempla la instalación mediante RPM:

Descargar en RPM desde aquí:
# wget http://apt.itlinux.cl/yum/downloads/varnish/varnish-2.0.5-1.i386.rpm
# wget http://apt.itlinux.cl/yum/downloads/varnish/varnish-libs-2.0.5-1.i386.rpm

E instalamos:

# rpm -hiv varnish-libs-2.0.5-1.i386.rpm
# rpm -hiv varnish-2.0.5-1.i386.rpm

Si ejecutamos “rpm -qc varnish” veremos donde están los archivos que nos interesa conocer para configurar Varnish (configuración, reglas y logs):

Los scripts de servicio que disponemos:

  • varnish: servidor de balanceo, proxy y caché
  • varnishlog, almacena logs en formato binario Varnish (ojo con los los que pueden ser bastante! usa logrotate). Los logs estarán en el directorio /var/log/varnish/
  • varnishncsa, almacena logs en formato Apache HTTPD, al que podemos aplicar software de estadísticas como AWStats o Webalizer para extraer información de acceso a Alfresco.

Los activamos al arranque del sistema:

# chkconfig varnish on
# chkconfig varnishlog on
# chkconfig varnishncsa on

Configuración del proceso y puertos:
# vi /etc/sysconfig/varnish

Básicamente con las siguientes opciones indicamos que Varnish escuche en el puerto 80, que la administración sea el puerto 6082, reenvíe el tráfico a través de la información que tiene en default.vcl, ejecute con usuario y grupo varnish y reserve un 1GB para el archivo de caché (ojo con hacer copy-paste y los \).

DAEMON_OPTS=”-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-u varnish -g varnish \
-w 50,500,120 \
-p listen_depth=4096 \
-p lru_interval=3600 \
-h classic,500009 \
-p thread_pool_max=4000 \
-p thread_pools=4 \
-p send_timeout=30 \
-p default_ttl=30 \

-p thread_pool_timeout=60 \
-p sess_timeout=2 \
-p pipe_timeout=30 \
-s file,/var/lib/varnish/varnish_storage.bin,1G”

NOTA: Para sistemas en producción se recomienda poner el archivo de la caché en un file system o disco independiente con las opciones noatime y nodiratime para mejorar el rendimiento.

Ahora configuramos Varnish para que reenvíe el tráfico al servidor de aplicaciones, en mi caso reenvío a localhost (127.0.0.1) y puerto 8080 ya que tengo Alfresco en la misma máquina corriendo sobre Tomcat levantado en el puerto 8080:

# vi /etc/varnish/default.vcl
backend default {
.host = “127.0.0.1”;
.port = “8080”;
}

Para ejecutarlo inicialmente y probar que funciona ejecutamos desde la línea de comandos:

# varnishd -a :80 -b localhost:8080 -T localhost:6082
NB: Storage size limited to 2GB on 32 bit architecture,
NB: otherwise we could run out of address space.
storage_file: filename: ./varnish.DcsMju (unlinked) size 2047 MB.
Using old SHMFILE

Para ejecutarlo normalmente, tras comprobar que el comando anterior funciona y matar el proceso con un kill -9 <pid>:

# /etc/init.d/varnish start
Starting varnish HTTP accelerator:                         [  OK  ]
# /etc/init.d/varnishlog start
Starting varnish logging daemon:                           [  OK  ]
# /etc/init.d/varnishncsa start
Starting varnish ncsa logging daemon:                      [  OK  ]

Para ver la administración/configuración en linea de Varnish:
# telnet localhost 6082
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).

Escape character is ‘^]’.
help
200 376
help [command]
ping [timestamp]
status
start
stop
stats
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
vcl.show <configname>

param.show [-l] [<param>]
param.set <param> <value>
quit
purge.url <regexp>
purge.hash <regexp>
purge <field> <operator> <arg> [&& <field> <oper> <arg>]…
purge.list

Comandos de interés iniciales son: status y stats

Para mejorar el rendimiento general de la aplicación podemos modificar las opciones del sistema en /etc/sysctl.conf:

net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216

net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 3
net.ipv4.tcp_tw_recycle = 1
net.core.netdev_max_backlog = 30000

net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
fs.file-max = 131072
vm.swappiness = 0

# Keep Alive

net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 5

Tras añadir esas opciones ejecutamos sysctl -p

También ampliamos los límites de uso del sistema del usuario varnish en /etc/security/limits.conf:

@varnish                soft    nofile          131072
@varnish                hard    nofile          131072
@varnish                soft    memlock         400000
@varnish                hard    memlock         400000

# End of file

Y eso es todo, si lo probáis ya me diréis, yo he hecho pruebas con wget y time, parece que si acelera bastante…


6 thoughts to “Mejorando la velocidad de Alfresco con Varnish”

  1. Muy buen artículo, como acostumbras 😉

    Una cosa, ¿es posible conectar varnish a tomcat vía AJP directamente al igual que mod_proxy?, ¿valdría con cambiar el puerto 8080 por el comunmente usado 8009 en este protocolo?

    Un saludo,
    fegor

  2. Gracias Fegor. De todos los ejemplos de configuración que he revisado no he visto nada de AJP y tampoco lo vi en las caracterísitcas de la solución: (http://varnish.projects.linpro.no/wiki/VarnishFeatures).

    Es decir, Varnish habla HTTP<->HTTP, incluso si se quiere usar HTTPS recomiendan esto como workaround (http://varnish.projects.linpro.no/wiki/FAQ#IsthereanywaytodoHTTPSwithVarnish)

    Por cierto, para la versión 2.1, que ya debería estar en la calle (Q2 2009), Varnish traerá una interfaz de administración gráfica que se puede ver aquí: http://varnish.projects.linpro.no/wiki/WebGui

    Saludos

  3. Justo estaba usando vanish con drupal y me he encontrado este post!! muy bueno bueno, q tal todo? 😉

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.