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_domain como 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:

  1. Idioma y licencia: elige el idioma de instalación y acepta la licencia.
  2. 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.
  3. 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.
  4. Configuración del sistema: servidor localhost, base de datos prestashop, usuario prestashop y la contraseña del paso 3. Mantén el prefijo de tablas ps_. Pulsa Probar la conexión a la base de datos antes de continuar.
  5. 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:

  1. 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.html y que la imagen se muestra.
  2. 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.
  3. 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.