Configuración de servidor LAMP/LEMP optimizado para PrestaShop
[INFO] Este artÃculo está diseñado para administradores de sistemas, desarrolladores y técnicos de ecommerce que buscan extraer el máximo rendimiento de su tienda PrestaShop. Se asume un conocimiento básico de Linux, lÃnea de comandos y configuración de servicios web.
Configurar un servidor PrestaShop no es simplemente instalar Apache, MySQL y PHP. Es un proceso de ajuste fino donde cada milisegundo cuenta, especialmente en picos de tráfico como Black Friday o campañas de marketing. Una mala configuración puede traducirse en Timeouts, errores 500 o una experiencia de usuario nefasta. Este artÃculo te guiará a través de dos caminos: el clásico LAMP PrestaShop (Linux, Apache, MySQL, PHP) y el moderno LEMP PrestaShop (Linux, Nginx, MySQL, PHP-FPM), con todas las optimizaciones necesarias para que tu tienda vuele.
Elección de la base: LAMP vs LEMP para PrestaShop
Antes de ensuciarnos las manos, debemos decidir la arquitectura. Ambas son válidas, pero tienen implicaciones directas en el rendimiento y la gestión de recursos.
Apache (LAMP): El veterano fiable
Apache sigue siendo una opción excelente, sobre todo si tu hosting compartido o VPS lo soporta de serie. Su módulo mod_rewrite es esencial para las URLs amigables de PrestaShop. Sin embargo, Apache puede consumir mucha RAM por proceso (especialmente con mod_php). La clave aquà es usar PHP-FPM en lugar de mod_php y activar MPM Event en lugar del clásico Prefork.
Nginx (LEMP): El motor de alto rendimiento
LEMP PrestaShop es la combinación ganadora para sitios con mucho tráfico. Nginx maneja las conexiones concurrentes de forma asÃncrona, consumiendo muy poca RAM. Al no tener .htaccess (se procesa en la configuración central), la velocidad de entrega de archivos estáticos (CSS, JS, imágenes) es superior. La desventaja: la curva de aprendizaje para las reglas de reescritura es un poco más alta, pero merece la pena.
[TIP] Si tu tráfico supera los 500 usuarios concurrentes, opta directamente por LEMP. Para tiendas pequeñas o con recursos limitados, un LAMP bien configurado es más que suficiente.
Configuración del sistema operativo (Linux)
Independientemente de la pila, el sistema base debe estar optimizado.
Ajustes del Kernel y lÃmites del sistema
Edita /etc/sysctl.conf para mejorar el manejo de conexiones:
# Aumentar cola de conexiones
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# Reducir tiempo de espera de conexiones TIME_WAIT
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# Aumentar memoria para buffers de red
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
Aplica con sysctl -p y aumenta los lÃmites de archivos abiertos en /etc/security/limits.conf:
* soft nofile 65535
* hard nofile 65535
Optimizando el stack LAMP PrestaShop
Vamos a configurar Apache para que sea eficiente con PrestaShop.
Instalación y configuración de Apache con MPM Event y PHP-FPM
-
Instala los paquetes necesarios:
apt update && apt install apache2 libapache2-mod-fcgid php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-intl php8.2-mbstring php8.2-xml php8.2-zip -
Activa los módulos correctos:
a2enmod proxy_fcgi setenvif headers rewrite http2 a2enconf php8.2-fpm a2dismod mpm_prefork a2enmod mpm_event systemctl restart apache2 -
Configura MPM Event en
/etc/apache2/mods-available/mpm_event.conf:<IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadLimit 64 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 10000 </IfModule>
Configuración de VirtualHost para PrestaShop
Crea tu archivo de sitio (ej. /etc/apache2/sites-available/tutienda.conf):
<VirtualHost *:80>
ServerName tudominio.com
DocumentRoot /var/www/prestashop
<Directory /var/www/prestashop>
AllowOverride All
Require all granted
</Directory>
# Redirigir a HTTPS (obligatorio para SEO)
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName tudominio.com
DocumentRoot /var/www/prestashop
SSLEngine on
SSLCertificateFile /ruta/cert.pem
SSLCertificateKeyFile /ruta/key.pem
# HTTP/2
Protocols h2 http/1.1
# Cache de archivos estáticos
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Cache-Control "max-age=2592000, public"
</FilesMatch>
<Directory /var/www/prestashop>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
</IfModule>
[WARNING] Nunca desactives AllowOverride en el directorio de PrestaShop. Necesita .htaccess para las URLs amigables y la seguridad básica.
Optimizando el stack LEMP PrestaShop
Aquà es donde realmente podemos arañar rendimiento.
Instalación de Nginx y PHP-FPM
apt install nginx php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-intl php8.2-mbstring php8.2-xml php8.2-zip php8.2-bcmath
Configuración maestra de Nginx para PrestaShop
Crea /etc/nginx/sites-available/prestashop:
server {
listen 80;
server_name tudominio.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name tudominio.com;
root /var/www/prestashop;
index index.php;
# SSL (ajusta rutas)
ssl_certificate /ruta/cert.pem;
ssl_certificate_key /ruta/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Logs
access_log /var/log/nginx/prestashop_access.log;
error_log /var/log/nginx/prestashop_error.log;
# Reglas crÃticas de PrestaShop
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS on;
# Buffer de PHP-FPM
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_read_timeout 300;
}
# Cacheo de archivos estáticos (inmutable)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
try_files $uri /index.php$is_args$args;
}
# Denegar acceso a archivos sensibles
location ~ /(app|cache|config|controllers|classes|vendor|translations|tests|src|override|tools|mails|pdf|themes/default-bootstrap|install|upgrade) {
deny all;
return 404;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
location ~* (\.md|\.git|\.env|composer\.json|package\.json) {
deny all;
return 404;
}
}
[INFO] La clave está en la lÃnea try_files $uri $uri/ /index.php$is_args$args. Esto evita que Nginx procese PHP para cada petición de archivo estático, descargando la CPU.
Ajustes de PHP-FPM (Común para LAMP y LEMP)
La configuración de PHP es el cuello de botella más común.
Configuración del Pool de PHP-FPM
Edita /etc/php/8.2/fpm/pool.d/www.conf:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
; Ajustar lÃmites de memoria y ejecución
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 300
php_admin_value[upload_max_filesize] = 20M
php_admin_value[post_max_size] = 25M
Para calcular pm.max_children: RAM_total / Memoria_media_por_proceso_PHP. Si cada proceso consume 50MB y tienes 4GB de RAM, no pongas más de 80 hijos.
Opcache: El acelerador de PHP
Asegúrate de tener Opcache activado en /etc/php/8.2/mods-available/opcache.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.fast_shutdown=1
opcache.validate_timestamps=0 # Solo en producción, reinicia PHP si cambias archivos
[WARNING] Si activas validate_timestamps=0, los cambios en archivos PHP no se reflejarán hasta que recargues PHP-FPM. Úsalo solo en producción.
MySQL/MariaDB: El corazón de los datos
PrestaShop es muy sensible a la latencia de base de datos. Usa MariaDB por su mejor rendimiento.
Configuración de MariaDB
Edita /etc/mysql/mariadb.conf.d/50-server.cnf:
[mysqld]
innodb_buffer_pool_size = 1G # 70% de la RAM disponible si solo tienes MySQL
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2 # Balance entre rendimiento y seguridad
innodb_flush_method = O_DIRECT
query_cache_type = 0 # Desactivar query cache en MariaDB 10.1+ (obsoleto)
query_cache_size = 0
tmp_table_size = 64M
max_heap_table_size = 64M
thread_cache_size = 256
max_connections = 200
Optimización especÃfica para PrestaShop
Ejecuta estas consultas para ajustar el motor:
SET GLOBAL join_buffer_size = 262144; -- 256KB
SET GLOBAL sort_buffer_size = 524288; -- 512KB
SET GLOBAL read_rnd_buffer_size = 262144;
Y programa un cron para optimizar tablas semanalmente:
0 3 * * 0 mysqlcheck -o --all-databases -u root -p'password'
Herramientas de monitorización y ajuste fino
No puedes optimizar lo que no mides.
Instalación de herramientas clave
# Monitorización de rendimiento en tiempo real
apt install htop iotop iftop
# Análisis de logs de acceso
apt install goaccess
# Benchmarking de servidor web
apt install apache2-utils # Para ab
Uso de ab (Apache Benchmark)
ab -n 1000 -c 50 https://tudominio.com/
Si ves errores de conexión o tiempos superiores a 2 segundos, revisa los lÃmites de archivos abiertos y el número de workers de PHP.
Monitorización de la base de datos
mysqladmin -u root -p status
mysqladmin -u root -p extended-status
Busca variables como Threads_connected, Slow_queries y Innodb_buffer_pool_read_requests. Un ratio bajo de hits en buffer pool indica que necesitas más memoria para InnoDB.
Buenas prácticas finales para el servidor PrestaShop
- Usa un CDN: Cloudflare, BunnyCDN o Fastly. Descarga el 80% del tráfico estático de tu servidor.
- Activa la compresión Brotli: Mejor que Gzip. En Nginx:
brotli on; brotli_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml; - Configura Redis para caché: Instala el módulo
php8.2-redisy configura PrestaShop para usar Redis como sistema de caché en lugar de archivos. Esto reduce drásticamente la E/S de disco. - Mantén PHP actualizado: PHP 8.2 es hasta un 30% más rápido que PHP 7.4 para aplicaciones como PrestaShop.
- Protege contra ataques de fuerza bruta: Usa
fail2banpara banear IPs que intenten acceder a/adminoxmlrpc.phprepetidamente.
Conclusión
Configurar un servidor PrestaShop óptimo no es un proceso de "instalar y olvidar". Requiere entender cómo interactúan el servidor web, PHP, la base de datos y el sistema operativo. Tanto LAMP PrestaShop como LEMP PrestaShop pueden ofrecer un rendimiento excelente si se aplican las optimizaciones descritas: un PHP-FPM bien ajustado, un Opcache activo, una base de datos con el buffer pool correcto y un servidor web configurado para servir estáticos sin tocar PHP.
El tiempo invertido en optimizar servidor PrestaShop se traduce directamente en una mejor experiencia de usuario, mejor posicionamiento SEO (Google penaliza la lentitud) y, en última instancia, mayores conversiones. Empieza por monitorizar tu configuración actual, aplica los cambios uno a uno y mide el impacto. Tu tienda (y tus clientes) te lo agradecerán.
