Magento: Cómo desplegar en producción

por David Abad
Desplegar Magento en producción

Magento tiene varios modos de ejecución y su proceso de despliegue es diferente según lo realicemos en un entorno de desarrollo o en un entorno de producción. A continuación se describe el proceso necesario para desplegar correctamente un sistema Magento en producción.

Proceso de despliegue

El proceso de despliegue de Magento en producción requiere de los siguientes pasos:

  • Instalar dependencias (Composer):
composer install --no-dev
  • Establecer el modo “producción” de Magento:
php bin/magento deploy:mode:set production
  • Habilitar el modo “mantenimiento” de Magento:
php bin/magento maintenance:enable
  • Habilitar las optimizaciones de Magento (Opcional):
php bin/magento config:set dev/js/minify_files 1
php bin/magento config:set dev/css/minify_files 1
php bin/magento config:set dev/css/merge_css_files 1
  • Lanzar las actualizaciones de módulos necesarias:
php bin/magento setup:upgrade
  • Compilar el código de Magento:
php bin/magento setup:di:compile
  • Desplegar los ficheros estáticos de Magento:
php bin/magento setup:static-content:deploy -j8 en_US es_ES
  • Habilitar y limpiar la caché:
php bin/magento cache:enable
php bin/magento cache:flush
  • Ajustar permisos:
chown -R www-data:www-data .
find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
  • Lanzar una reindexación de los datos de Magento (Opcional):
php bin/magento indexer:reindex
  • Desactivar el modo “mantenimiento” de Magento:
php bin/magento maintenance:disable

Script final

composer install --no-dev
php bin/magento deploy:mode:set production
php bin/magento maintenance:enable
php bin/magento config:set dev/js/minify_files 1
php bin/magento config:set dev/css/minify_files 1
php bin/magento config:set dev/css/merge_css_files 1
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -j8 en_US es_ES
php bin/magento cache:enable
php bin/magento cache:flush
chown -R www-data:www-data .
find var generated vendor pub/static pub/media app/etc -type f -exec chmod g+w {} +
find var generated vendor pub/static pub/media app/etc -type d -exec chmod g+ws {} +
php bin/magento indexer:reindex
php bin/magento maintenance:disable

Despliegue en Magento Cloud

Todo este proceso se realiza de forma transparente en los entornos de Magento Cloud cada vez que se realiza un GIT PUSH al repositorio asociado. Por lo que en este entorno no es necesario preparar ni lanzar ningún script.

No obstante, Magento Cloud cuenta con un asistente (incluido en su herramienta ece-tools) que verifica que la configuración del proyecto a desplegar es la óptima. Es recomendable lanzar esta herramienta y seguir las recomendaciones indicadas:

~/vendor/magento/ece-tools/bin/ece-tools wizard:ideal-state

Tecnología de cache/sesiones

A la hora de poner un proyecto Magento en producción es muy importante revisar la configuración de determinados aspectos que pueden afectar notablemente al rendimiento de la página:

  • Tecnología de Cache: Es recomendable utilizar un sistema de BD en memoria como Redis Server, en vez de utilizar el sistema de ficheros que puede perjudicar el rendimiento.
  • Tecnología de Full Page Cache: Es recomendable utilizar la tecnología Varnish. En caso de no ser posible, Redis Server también puede ofrecer un buen rendimiento.
  • Tecnología de almacenamiento de sesiones: Es recomendable utilizar la tecnología Redis Server para el almacenamiento de las sesiones de nuestros usuarios, en vez de almacenarlas directamente en base de datos o en ficheros, que puede perjudicar al rendimiento del sitio.

Esta configuración es almacenada en el fichero app/etc/env.php de Magento. A continuación se muestra un ejemplo de configuración de todos los elementos anteriores con la tecnología Redis Server:

[...]
    'session' => [
        'save' => 'redis',
        'redis' => [
            'host' => '127.0.0.1',
            'port' => '6379',
            'password' => '',
            'timeout' => '2.5',
            'persistent_identifier' => '',
            'database' => '1',
            'compression_threshold' => '2048',
            'compression_library' => 'gzip',
            'log_level' => '4',
            'max_concurrency' => '24',
            'break_after_frontend' => '5',
            'break_after_adminhtml' => '30',
            'first_lifetime' => '600',
            'bot_first_lifetime' => '60',
            'bot_lifetime' => '7200',
            'disable_locking' => '1',
            'min_lifetime' => '60',
            'max_lifetime' => '2592000'
        ]
    ],
    'cache' => [
        'frontend' => [
            'default' => [
                'backend' => 'Cm_Cache_Backend_Redis',
                'backend_options' => [
                    'server' => '127.0.0.1',
                    'database' => '2',
                    'port' => '6379'
                ]
            ],
            'page_cache' => [
                'backend' => 'Cm_Cache_Backend_Redis',
                'backend_options' => [
                    'server' => '127.0.0.1',
                    'database' => '3',
                    'port' => '6379',
                    'compress_data' => '0'
                ]
            ]
        ],
        'allow_parallel_generation' => false
    ],
[...]

Revisión de tareas periódicas (Crontab)

Otro punto importante a revisar es que las tareas periódicas de Magento se encuentren correctamente configurados en el crontab de nuestro sistema:

* * * * * php [...]/bin/magento cron:run | grep -v "Ran jobs by schedule" >> [...]/var/log/magento.cron.log
* * * * * php [...]/bin/magento setup:cron:run >> [...]/var/log/setup.cron.log
* * * * * php [...]/update/cron.php >> [...]/var/log/update.cron.log

Limpieza de logs

El uso de Magento va generando una serie de ficheros de log en el directorio var/log. Es importante revisar de forma periódica estos ficheros, ya que un crecimiento rápido de los mismos puede estar indicando un error grave en la plataforma. 

No obstante, es conveniente configurar una limpieza periódica de estos ficheros de log, evitando llenar el almacenamiento del sistema. Para ello podemos incluir en el crontab del sistema un comando logrotate, que se encargue de ir archivando logs antiguos. En caso de no contar con la herramienta logrotate, podemos utilizar el comando “sed” del sistema para controlar el número máximo de lineas en estos ficheros:

find [...]/var/log/* | xargs sed -i -e :a -e '$q;N;10000,$D;ba' 

Déjanos tu email para recibir contenido interesante en tu bandeja de entrada, cada mes.

¡No hacemos spam!

Otros artículos