--- title: "Cómo instalar PrestaShop 9 en Ubuntu 24.04 con Nginx" description: "Instala PrestaShop 9 en Ubuntu 24.04 con Nginx, PHP 8.3-FPM y MariaDB, protege la tienda con HTTPS de Let's Encrypt y déjala lista para producción." category: "E-commerce y CMS" language: es source: https://cubepath.com/es/docs/e-commerce-y-cms/instalacion-de-prestashop-en-linux updated: 2026-09-25 --- # Cómo instalar PrestaShop 9 en Ubuntu 24.04 con Nginx 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: ```bash 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: ```bash systemctl is-active nginx mariadb php8.3-fpm ``` ```output 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: ```bash sudo nano /etc/php/8.3/fpm/conf.d/99-prestashop.ini ``` ```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: ```bash sudo systemctl restart php8.3-fpm sudo php-fpm8.3 -i | grep -E '^(memory_limit|upload_max_filesize|max_input_vars)' ``` ```output 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: ```bash 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: ```bash sudo mariadb ``` ```sql 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: ```bash mariadb -u prestashop -p -e "SHOW DATABASES;" ``` ```output +--------------------+ | 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](https://github.com/PrestaShop/PrestaShop/releases) y guárdala en una variable. En este ejemplo se usa la 9.0.0: ```bash 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: ```bash unzip -q "prestashop_${PS_VERSION}.zip" -d ps-release ls ps-release ``` ```output 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: ```bash 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: ```bash ls /var/www/prestashop ``` ```output 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: ```bash sudo nano /etc/nginx/sites-available/prestashop ``` ```nginx 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: ```bash 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 ``` ```output 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: ```bash 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: ```bash sudo certbot renew --dry-run ``` ```output 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: ```bash 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: ```bash ls -d /var/www/prestashop/admin* ``` ```output /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: ```bash curl -sI https://your_domain/ | head -n 1 curl -sI https://your_domain/app/config/parameters.php | head -n 1 ``` ```output 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: ```bash sudo nano /usr/local/bin/prestashop-backup ``` ```bash #!/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: ```bash sudo chmod 750 /usr/local/bin/prestashop-backup sudo /usr/local/bin/prestashop-backup sudo ls -lh /var/backups/prestashop ``` ```output -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: ```bash sudo crontab -e ``` ```text 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.