Con la temporada de Navidad y fiestas cerca, la performance de nuestro Magento durante eventos de alta concurrencia/tráfico puede ser determinante para lograr una mayor cantidad de ventas usando una menor cantidad de recursos.
En este post podemos encontrar una guía para instalar Varnish + Turpentine como acelerador HTTP, memcached para cache rápido de backend y tunear MySql y PHP para optimizar la performance de nuestra tienda.
Varnish
En primer lugar vamos a instalar Varnish para luego utilizarlo con Magento.
apt-get install apt-transport-https
curl https://repo.varnish-cache.org/GPG-key.txt | apt-key add -
echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.1" >> /etc/apt/sources.list.d/varnish-cache.list
apt-get update
apt-get install varnish
Una vez instalado, necesitamos configurar Varnish en los puertos correctos para que corra frente al servidor que usemos, en nuestro caso apache.
Vamos a utilizar varnish en el puerto 80 y apache en el 8080 para esta guía. En primer lugar, debemos editar el archivo /etc/default/varnish y descomentar la alternativa 2.
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-S /etc/varnish/secret \
-s malloc,256m"
Una vez guardado el archivo /etc/default/varnish debemos configurar apache para que escuche el puerto 8080. Para hacer esto, modificamos el archivo /etc/apache2/ports.conf e indicamos en NameVirtualHost y Listen los puertos a utilizar.
Una vez modificado deberíamos ver algo como:
NameVirtualHost 127.0.0.1:8080
Listen 127.0.0.1:8080
Lo mismo para los archivos de hosts virtuales, el resultado debería ser: <VirtualHost 127.0.0.1:8080>
Para luego reiniciar apache y varnish con:
service apache2 restart
service varnish restart
De forma predeterminada, Varnish no cachea solicitudes con cookies y Magento envía la cookie de frontend con cada petición causando una tasa de éxito nula para Varnish.
Para la integración con Magento, Nexcess_Turpentine configura Varnish para ser utilizado por Magento y mejora enormemente la tasa de cacheo. La instalación es simple y puede ser mediante Magento Connect, composer o Firegento.
Una vez instalado y configurado Turpentine, solo debemos aplicar el VCL desde la pantalla de Cache. Para verificar el funcionamiento podemos usar varnishstat.
Memcached
En primer lugar instalaremos memcached utilizando:
apt-get install memcached
apt-get install php-pear
pecl install memcache
Y luego crearemos un archivo llamado memcache.ini dentro de /etc/php5/conf.d/ con contenido ‘extension=memcache.so’.
Una vez instalado, debemos modificar el archivo local.xml en Magento para utilizar memcached. Un ejemplo de como configurarlo puede encontrarse en app/etc/local.xml.additional.
Dentro de app/etc/local.xml utilizaremos:
<cache>
<backend>memcached</backend><!-- apc / memcached / empty=file -->
<memcached><!-- memcached cache backend related config -->
<servers><!-- any number of server nodes can be included -->
<server>
<host><![CDATA[127.0.0.1]]></host>
<port><![CDATA[11211]]></port>
<persistent><![CDATA[1]]></persistent>
</server>
</servers>
<compression><![CDATA[0]]></compression>
<cache_dir><![CDATA[]]></cache_dir>
<hashed_directory_level><![CDATA[]]></hashed_directory_level>
<hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
<file_name_prefix><![CDATA[]]></file_name_prefix>
</memcached>
</cache>
Para indicarle a Magento que use memcached como cache de backend.
Para comprobar el funcionamiento de memcached podemos utilizar stats mediante telnet:
telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
MySql + PHP
Magento es un software que usa intensamente los recursos de nuestro servidor. Para que este funcione velozmente, tenemos que modificar algunos valores del php.ini y del my.cnf.
Siempre es recomendable utilizar las últimas versiones estables de PHP y MySql así como Percona o MariaDB para remplazar a MySql.
Para ver que archivo php.ini estamos utilizando podemos crear un archivo en el root de Magento con contenido:
<?php phpinfo(); ?>
En mi caso el archivo es /home/[username]/etc/php.ini
En primer lugar modificaremos el memory_limit de PHP a un valor óptimo para Magento: 1024M. Esto se logra simplemente buscando memory_limit dentro de este archivo y modificando el valor a 1024M.
memory_limit = 1024M
También podemos modificar:
max_execution_time = 300
Por último modificaremos:
pdo_mysql.cache_size = 2000
Algunos hosts permiten modificar estos parámetros dentro del .htaccess o mediante la directiva ini_set() de PHP, personalmente recomiendo utilizar siempre servidores dedicados para Magento y realizar estos cambios directamente en el archivo php.ini.
Por último modificaremos el archivo my.cnf normalmente ubicado en /etc/my.cnf o en /etc/mysql/my.cnf dependiendo de la carpeta raíz de la instalación de MySql.
Para obtener las configuraciones óptimas para tu servidor de base de datos recomiendo utilizar https://tools.percona.com/ y http://mysqltuner.com/.
Como detalle, siempre es inteligente contar con un backup completo de la base de datos antes de realizar cualquier cambio.
También es recomendable la utilización de CDN y minificación y merge de JS y CSS desde Magento, tareas simples que se pueden realizar desde Sistemas – Configuración – Desarrollador.
Con estas simples modificaciones deberíamos ver un incremento notable de la velocidad de la tienda en conjunto con una disminución de la utilización de recursos del servidor.