Cómo mejorar la performance de Magento

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.