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.

Publicado por Miguel Balparda

Desarrollador Sr. Magento @ Nexcess. Viajante de tiempo completo. Web