PrestaShop es una plataforma de comercio electrónico de código abierto muy extendida en Europa, con un amplio catálogo de módulos y temas y unos requisitos de servidor moderados. En este tutorial instalarás PrestaShop 9 en Ubuntu 24.04 sobre Nginx, PHP 8.3-FPM y MariaDB, lo protegerás con un certificado de Let's Encrypt y dejarás la tienda preparada para producción: carpeta de instalación eliminada, URL amigables, caché activada y modo de depuración desactivado.
Requisitos previos
Para seguir esta guía necesitas:
- Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 2 GB de RAM y 20 GB de disco.
- Un usuario no root con privilegios
sudo. - Un dominio con un registro DNS de tipo A que apunte a la IP del servidor. En la guía se usa
your_domaincomo marcador. - Los puertos 22, 80 y 443 abiertos.
PrestaShop 9 funciona con PHP 8.1 a 8.4, así que el PHP 8.3 de Ubuntu 24.04 es compatible sin repositorios externos. Si vas a instalar PrestaShop 8, ten en cuenta que solo admite hasta PHP 8.1 y necesitarías otra versión de PHP.
Paso 1: Instalar Nginx, MariaDB y PHP 8.3
Instala el servidor web, la base de datos, PHP-FPM y las extensiones que PrestaShop comprueba durante la instalación:
sudo apt update
sudo apt install -y nginx mariadb-server unzip curl \
php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-intl \
php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath
Comprueba que los servicios están activos:
systemctl is-active nginx mariadb php8.3-fpm
active
active
active
Paso 2: Ajustar PHP
Los valores por defecto de PHP son bajos para una tienda: PrestaShop recomienda al menos 256 MB de memoria, y el panel necesita subir imágenes y enviar formularios con muchos campos (traducciones, combinaciones de productos). Crea un archivo de configuración propio para PHP-FPM:
sudo nano /etc/php/8.3/fpm/conf.d/99-prestashop.ini
memory_limit = 256M
upload_max_filesize = 16M
post_max_size = 16M
max_execution_time = 300
max_input_vars = 5000
allow_url_fopen = On
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 20000
opcache.revalidate_freq = 60
Reinicia PHP-FPM y comprueba que se han aplicado:
sudo systemctl restart php8.3-fpm
sudo php-fpm8.3 -i | grep -E '^(memory_limit|upload_max_filesize|max_input_vars)'
max_input_vars => 5000 => 5000
memory_limit => 256M => 256M
upload_max_filesize => 16M => 16M
Paso 3: Crear la base de datos
Ejecuta primero el asistente de seguridad de MariaDB. Mantén la autenticación por unix_socket para root (responde n a cambiar a contraseña si te lo pregunta) y responde que sí a eliminar usuarios anónimos, el acceso remoto de root y la base de datos de pruebas:
sudo mariadb-secure-installation
Crea una base de datos y un usuario dedicado para la tienda. Sustituye your_strong_password por una contraseña robusta:
sudo mariadb
CREATE DATABASE prestashop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'prestashop'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON prestashop.* TO 'prestashop'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Comprueba que el usuario accede a su base de datos:
mariadb -u prestashop -p -e "SHOW DATABASES;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| prestashop |
+--------------------+
Paso 4: Descargar PrestaShop
Consulta la última versión estable de la rama 9 en la página de versiones de PrestaShop en GitHub y guárdala en una variable. En este ejemplo se usa la 9.0.0:
PS_VERSION=9.0.0
cd /tmp
curl -fLO "https://github.com/PrestaShop/PrestaShop/releases/download/${PS_VERSION}/prestashop_${PS_VERSION}.zip"
El archivo publicado contiene a su vez otro zip con la tienda. Extrae el primero en un directorio temporal:
unzip -q "prestashop_${PS_VERSION}.zip" -d ps-release
ls ps-release
Install_PrestaShop.html index.php prestashop.zip
Extrae prestashop.zip en el directorio de la tienda y asigna los archivos al usuario de PHP-FPM, que necesita escribir en ellos para instalar módulos, generar la caché y guardar imágenes:
sudo mkdir -p /var/www/prestashop
sudo unzip -q ps-release/prestashop.zip -d /var/www/prestashop
sudo chown -R www-data:www-data /var/www/prestashop
rm -rf ps-release "prestashop_${PS_VERSION}.zip"
Comprueba que el directorio contiene la tienda y la carpeta de instalación:
ls /var/www/prestashop
INSTALL.txt LICENSES admin app bin classes composer.lock config controllers docs download img index.php install js localization mails modules override pdf src themes translations upload var vendor webservice
Paso 5: Configurar Nginx
La configuración de Nginx para PrestaShop tiene tres partes: reescribir las URL amigables de las imágenes de productos y categorías hacia su ruta real en img/, enviar el resto a index.php, y bloquear el acceso directo a los directorios de código y configuración. Crea el bloque de servidor:
sudo nano /etc/nginx/sites-available/prestashop
server {
listen 80;
listen [::]:80;
server_name your_domain;
root /var/www/prestashop;
index index.php;
client_max_body_size 16M;
# Errores 404 gestionados por PrestaShop
error_page 404 /index.php?controller=404;
# URL amigables de imágenes de producto y categoría
rewrite ^/(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$1$2.jpg last;
rewrite ^/(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$1$2$3.jpg last;
rewrite ^/(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$1$2$3$4.jpg last;
rewrite ^/(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg last;
rewrite ^/(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg last;
rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg last;
rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg last;
rewrite ^/(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(-[\w-]+)?/.+\.jpg$ /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg last;
rewrite ^/c/([\w.-]+)/.+\.jpg$ /img/c/$1.jpg last;
# API de servicios web
rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# Bloquear archivos ocultos, salvo la validación de certificados
location ~ /\.(?!well-known) {
deny all;
}
# Bloquear directorios de código, configuración y datos internos
location ~ ^/(app|bin|cache|classes|config|controllers|docs|localization|override|src|tests|translations|var|vendor)/ {
deny all;
}
location ~ \.(log|tpl|twig|sass|yml)$ {
deny all;
}
location ~* \.(css|js|gif|jpe?g|png|webp|avif|svg|ico|woff2?)$ {
expires 30d;
access_log off;
try_files $uri =404;
}
location ~ [^/]\.php(/|$) {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
}
El bloque PHP usa [^/]\.php(/|$) en lugar del habitual \.php$ porque el panel de administración usa rutas como /adminXXXX/index.php/sell/catalog/products. El snippet de Ubuntu fastcgi-php.conf ya separa esa parte final y la pasa a PHP como PATH_INFO.
Activa el sitio, desactiva el sitio por defecto y recarga Nginx:
sudo ln -s /etc/nginx/sites-available/prestashop /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Paso 6: Activar HTTPS
Instala el certificado antes de ejecutar el instalador, así PrestaShop detecta HTTPS y lo activa en toda la tienda desde el principio. Abre el cortafuegos y ejecuta Certbot:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d your_domain
Certbot añade la configuración TLS al bloque de servidor y la redirección de HTTP a HTTPS. Comprueba la renovación automática:
sudo certbot renew --dry-run
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/your_domain/fullchain.pem (success)
Paso 7: Ejecutar el instalador web
Abre https://your_domain/install/ en el navegador. El asistente te guía por estos pasos:
- Idioma y licencia: elige el idioma de instalación y acepta la licencia.
- Compatibilidad del sistema: comprueba PHP, extensiones y permisos. Todo debe aparecer en verde; si falta algo, instala la extensión indicada y recarga la página.
- Información de la tienda: nombre, actividad, país y los datos de la cuenta de administrador. Marca Activar SSL si aparece la opción.
- Configuración del sistema: servidor
localhost, base de datosprestashop, usuarioprestashopy la contraseña del paso 3. Mantén el prefijo de tablasps_. Pulsa Probar la conexión a la base de datos antes de continuar. - Instalación: tarda unos minutos.
Al terminar, el instalador muestra enlaces a la tienda y al panel de administración.
Paso 8: Eliminar la carpeta de instalación y localizar el panel
La carpeta install permitiría volver a ejecutar el instalador sobre tu tienda. Elimínala:
sudo rm -rf /var/www/prestashop/install
Por seguridad, PrestaShop renombra la carpeta admin con un sufijo aleatorio durante la instalación. Consulta su nombre:
ls -d /var/www/prestashop/admin*
/var/www/prestashop/admin123abc4xyz
Guárdalo en un lugar seguro: el panel estará en https://your_domain/admin123abc4xyz/. Abre esa URL, inicia sesión con la cuenta creada en el instalador y confirma que llegas al panel de control.
Paso 9: Preparar la tienda para producción
Con el panel funcionando, aplica estos ajustes:
- URL amigables: en Configurar > Parámetros de la tienda > Tráfico y SEO, activa URL amigables. Las reglas del paso 5 ya se encargan de reescribirlas. Guarda y abre una ficha de producto para comprobar que la URL tiene el formato
https://your_domain/es/categoria/12-producto.htmly que la imagen se muestra. - Rendimiento: en Configurar > Parámetros avanzados > Rendimiento, comprueba que Modo de depuración está en No, que la caché de plantillas Smarty está en Nunca recompilar los archivos de plantillas y que Caché está activado.
- Correo: en Configurar > Parámetros avanzados > Direcciones de correo electrónico, configura un servidor SMTP para que los correos de pedidos y registros lleguen a los clientes. Envía un correo de prueba desde la misma página.
Comprueba desde el servidor que la tienda responde correctamente y que los directorios internos no son accesibles:
curl -sI https://your_domain/ | head -n 1
curl -sI https://your_domain/app/config/parameters.php | head -n 1
HTTP/2 200
HTTP/2 403
Haz también una prueba real: añade un producto al carrito en una ventana de incógnito y completa un pedido con el método de pago de prueba Pago por transferencia bancaria.
Paso 10: Programar copias de seguridad
Una tienda necesita copia de la base de datos (pedidos, clientes, catálogo) y de los archivos que cambian (imágenes, módulos y temas). Crea un script de copia:
sudo nano /usr/local/bin/prestashop-backup
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/var/backups/prestashop"
STAMP="$(date +%F)"
KEEP_DAYS=14
mkdir -p "$BACKUP_DIR"
mariadb-dump --single-transaction --quick prestashop | gzip > "$BACKUP_DIR/db-$STAMP.sql.gz"
tar -czf "$BACKUP_DIR/files-$STAMP.tar.gz" -C /var/www prestashop
find "$BACKUP_DIR" -type f -mtime +"$KEEP_DAYS" -delete
Hazlo ejecutable, pruébalo y comprueba que se generan los archivos. Al ejecutarse como root, mariadb-dump se autentica por unix_socket sin necesidad de guardar contraseñas:
sudo chmod 750 /usr/local/bin/prestashop-backup
sudo /usr/local/bin/prestashop-backup
sudo ls -lh /var/backups/prestashop
-rw-r--r-- 1 root root 1.1M Sep 25 03:00 db-2026-09-25.sql.gz
-rw-r--r-- 1 root root 142M Sep 25 03:00 files-2026-09-25.tar.gz
Prográmalo cada noche a las 03:00 en el crontab de root:
sudo crontab -e
0 3 * * * /usr/local/bin/prestashop-backup
Copia periódicamente /var/backups/prestashop a otro sistema para poder recuperarte si pierdes el servidor.
Solución de problemas
El instalador marca permisos en rojo. Algún archivo no pertenece a www-data. Repite sudo chown -R www-data:www-data /var/www/prestashop.
Las imágenes de producto no se muestran con URL amigables activadas. Faltan las reglas rewrite del paso 5 o Nginx no se recargó. Comprueba con sudo nginx -T | grep img/p y recarga.
El panel muestra errores 404 al navegar entre secciones. El bloque PHP no está pasando PATH_INFO. Comprueba que el location usa [^/]\.php(/|$) e incluye snippets/fastcgi-php.conf.
Pantalla en blanco o error 500. Activa temporalmente el modo de depuración en Parámetros avanzados > Rendimiento o revisa /var/www/prestashop/var/logs/ y sudo tail -n 50 /var/log/nginx/error.log. Desactívalo de nuevo al terminar.
Conclusión
Tu tienda PrestaShop 9 ya funciona en Ubuntu 24.04 con Nginx, PHP 8.3-FPM y MariaDB, protegida con HTTPS, con la instalación eliminada, el panel en una ruta no predecible y copias de seguridad diarias. Como siguientes pasos, instala el módulo de pago de tu pasarela, configura los transportistas e impuestos de tu país y activa Memcached o APCu como sistema de caché desde la página de rendimiento si el catálogo crece.
