PrestaShop Instaleation on Linux

PrestaShop is an open-source e-commerce platform known for ease of use, extensive module ecosystem, and lower resource requirements compared to enterprise solutions. Instaleation on Linux requires PHP 7.2+, MySQL 5.7+, and web server configuration. This guide covers comprehensive PrestaShop setup including system prerequisites, LEMP stack installation, SSL/TLS security, performance tuning, and best practices for production environments.

Tabla de contenidos

Requisitos del sistema

PrestaShop requires modern Linux infrastructure with sufficient resources. Verifique your VPS meets minimum specifications.

Check system requirements:

# Check available RAM
free -h

# Check disk space
df -h /

# Check CPU cores
nproc

# Check Linux distribution
cat /etc/os-release

Recommended specifications for production PrestaShop:

  • RAM: 4-8GB minimum, 16GB+ for large catalogs
  • Storage: SSD with 50GB+ available space
  • CPU: 2+ cores
  • Distribution: Ubuntu 20.04 LTS or later, Debian 11+

Actualice los paquetes del sistema:

sudo apt update
sudo apt upgrade -y
sudo apt install curl wget git zip unzip vim htop build-essential -y

Cree a dedicated user for PrestaShop:

sudo useradd -m -s /bin/bash prestashop
sudo usermod -aG www-data prestashop

LEMP Stack Setup

Instale Linux, Nginx, MySQL, and PHP components required for PrestaShop.

Instale Nginx web server:

sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
sudo nginx -t

Cree web root directory:

sudo mkdir -p /var/www/prestashop
sudo chown -R prestashop:www-data /var/www/prestashop
sudo chmod -R 755 /var/www/prestashop

Instale MariaDB (MySQL compatible):

sudo apt install mariadb-server mariadb-client -y
sudo systemctl start mariadb
sudo systemctl enable mariadb

Secure MariaDB installation:

sudo mysql_secure_installation

# When prompted:
# Enter current password: press Enter (no password)
# Set root password: Choose secure password
# Remove anonymous users: y
# Disable root login remotely: y
# Remove test database: y
# Reload privilege tables: y

Cree PrestaShop database:

sudo mysql -u root -p << EOF
CREATE DATABASE prestashop_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'prestashop_user'@'localhost' IDENTIFIED BY 'SecurePassword123!';
GRANT ALL PRIVILEGES ON prestashop_db.* TO 'prestashop_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
EOF

Instale PHP 8.1 with required extensions:

# Add PHP repository
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# Install PHP and required extensions
sudo apt install php8.1 php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd \
    php8.1-intl php8.1-json php8.1-xml php8.1-zip php8.1-mbstring \
    php8.1-soap php8.1-ldap php8.1-imagick php8.1-opcache php8.1-cli -y

# Start PHP-FPM
sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm

Verifique PHP extensions:

php -m | grep -E "curl|gd|intl|json|xml|zip|mbstring|soap"
php -v

PrestaShop Descargue and Instaleation

Descargue PrestaShop from official sources and prepare for installation.

Check latest PrestaShop version:

# Visit https://github.com/PrestaShop/PrestaShop/releases for latest version
VERSION="8.1.1"

cd /var/www/prestashop
sudo wget https://github.com/PrestaShop/PrestaShop/releases/download/${VERSION}/prestashop_${VERSION}.zip

sudo unzip prestashop_${VERSION}.zip
sudo rm prestashop_${VERSION}.zip

Extract PrestaShop files:

cd /var/www/prestashop
sudo unzip prestashop_${VERSION}.zip -d ./temp
sudo mv temp/* .
sudo rmdir temp

Establezca los permisos correctos:

# Set directory ownership
sudo chown -R www-data:www-data /var/www/prestashop

# Set file permissions
sudo find /var/www/prestashop -type f -exec chmod 644 {} \;
sudo find /var/www/prestashop -type d -exec chmod 755 {} \;

# Writable directories
sudo chmod -R 777 /var/www/prestashop/var
sudo chmod -R 777 /var/www/prestashop/cache
sudo chmod -R 777 /var/www/prestashop/config
sudo chmod -R 777 /var/www/prestashop/img
sudo chmod -R 777 /var/www/prestashop/modules
sudo chmod -R 777 /var/www/prestashop/override
sudo chmod -R 777 /var/www/prestashop/upload

Access PrestaShop installation wizard:

# Navigate to http://your-server-ip/install

# The installer will guide you through:
# 1. License acceptance
# 2. System compatibility check
# 3. Database configuration
# 4. Store information
# 5. Admin account setup

Or install via command line (if available in your version):

cd /var/www/prestashop

php install/console.php \
    --domain=example.com \
    --db_server=localhost \
    --db_name=prestashop_db \
    --db_user=prestashop_user \
    --db_password="SecurePassword123!" \
    --shop_name="My Store" \
    --firstname=Admin \
    --lastname=User \
    [email protected] \
    --password=AdminPassword123!

Remove installation directory after setup:

# CRITICAL: Remove installer to prevent unauthorized setup
sudo rm -rf /var/www/prestashop/install
sudo rm -rf /var/www/prestashop/api

Verifique installation:

# Check configuration file exists
ls -la /var/www/prestashop/config/settings.inc.php

# Test database connection
mysql -u prestashop_user -p "SecurePassword123!" prestashop_db -e "SELECT 1;"

Configuración de PHP

Optimize PHP settings for PrestaShop performance and security.

Edit PHP-FPM pool configuration:

sudo nano /etc/php/8.1/fpm/pool.d/www.conf

Apply optimized settings:

[www]
user = www-data
group = www-data
listen = /run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Process management
pm = dynamic
pm.max_children = 32
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16
pm.max_requests = 5000

; Timeouts
request_terminate_timeout = 300
request_slowlog_timeout = 10s
slowlog = /var/log/php8.1-fpm-slow.log

Configure php.ini for PrestaShop:

sudo nano /etc/php/8.1/fpm/php.ini

Set essential parameters:

; Memory and execution limits
memory_limit = 256M
max_execution_time = 300
max_input_time = 300
upload_max_filesize = 128M
post_max_size = 128M

; Performance
realpath_cache_size = 2048K
realpath_cache_ttl = 3600
opcache.enable = 1
opcache.memory_consumption = 128
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 0

; Security
disable_functions = 
expose_php = Off
display_errors = Off
log_errors = On
error_log = /var/log/php8.1-fpm-errors.log

; Session handling
session.save_path = /var/lib/php/sessions
session.gc_maxlifetime = 28800
session.cookie_secure = On
session.cookie_httponly = On
session.cookie_samesite = Lax

Reinicie PHP-FPM:

sudo systemctl restart php8.1-fpm
sudo systemctl status php8.1-fpm

MySQL Optimization

Configure MySQL for efficient PrestaShop database operations.

Edit MySQL configuration:

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Apply production settings:

[mysqld]
; InnoDB settings
default-storage-engine = InnoDB
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1

; Connection settings
max_connections = 200
max_allowed_packet = 256M
connect_timeout = 10
wait_timeout = 600

; Performance
tmp_table_size = 256M
max_heap_table_size = 256M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2

Reinicie MySQL:

sudo systemctl restart mariadb
sudo systemctl status mariadb

Cree important indexes:

mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
-- Product search optimization
ALTER TABLE ps_product ADD INDEX idx_status (active);
ALTER TABLE ps_product ADD INDEX idx_visibility (visibility);

-- Order optimization
ALTER TABLE ps_orders ADD INDEX idx_customer_date (id_customer, date_add);
ALTER TABLE ps_orders ADD INDEX idx_status (current_state);

-- Checkout performance
ALTER TABLE ps_cart ADD INDEX idx_customer (id_customer);
ALTER TABLE ps_cart ADD INDEX idx_date (date_add);
EOF

Nginx Server Configuration

Configure Nginx to serve PrestaShop efficiently with proper rewrite rules.

Cree Nginx configuration:

sudo nano /etc/nginx/sites-available/prestashop.conf

Apply optimized configuration:

upstream php_backend {
    server unix:/run/php/php8.1-fpm.sock;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/prestashop;
    index index.php index.html;

    access_log /var/log/nginx/prestashop_access.log;
    error_log /var/log/nginx/prestashop_error.log warn;

    # Security headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;

    # Caching static files
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        expires 365d;
        add_header Cache-Control "public, immutable";
    }

    # Block access to sensitive files
    location ~ /\. {
        deny all;
    }

    location ~ ~* "\.php$" {
        deny all;
    }

    location = /robots.txt {
        allow all;
    }

    location ~* "(.*)/\." {
        deny all;
    }

    # PrestaShop rewrite rules
    location / {
        rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
        
        if (!-e $request_filename) {
            rewrite ^(.*)$ /index.php last;
        }
    }

    # PHP handler
    location ~ \.php$ {
        fastcgi_pass php_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param REMOTE_ADDR $http_x_forwarded_for;
    }

    # Admin panel
    location ~ ^/admin-custom/ {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /admin-custom/index.php last;
        }
    }
}

Enable Nginx configuration:

sudo ln -s /etc/nginx/sites-available/prestashop.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL/TLS Implementation

Secure PrestaShop with SSL/TLS encryption using Let's Encrypt.

Instale Certbot:

sudo apt install certbot python3-certbot-nginx -y

Obtain SSL certificate:

sudo certbot certonly --nginx -d example.com -d www.example.com

Update Nginx configuration with SSL:

sudo nano /etc/nginx/sites-available/prestashop.conf

Add SSL configuration:

# Redirect HTTP to HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS server
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    
    # SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    
    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    
    # ... rest of server configuration ...
}

Configure automatic renewal:

# Certbot auto-renewal is configured by default
# Verify renewal service
sudo systemctl status certbot.timer

# Test renewal
sudo certbot renew --dry-run

Update PrestaShop settings for HTTPS:

mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
UPDATE ps_configuration SET value = 'https://example.com/' WHERE name = 'PS_SHOP_DOMAIN_SSL';
UPDATE ps_configuration SET value = 'https://example.com/' WHERE name = 'PS_BASE_URL_SSL';
UPDATE ps_configuration SET value = 1 WHERE name = 'PS_SSL_ENABLED';
EOF

Recargue Nginx:

sudo nginx -t
sudo systemctl reload nginx

Optimización del rendimiento

Implement caching and optimization techniques for PrestaShop.

Instale and configure caching:

# Enable PrestaShop's built-in caching
mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
UPDATE ps_configuration SET value = 'CacheMemcache' WHERE name = 'PS_CACHING';
UPDATE ps_configuration SET value = 'localhost' WHERE name = 'PS_CACHE_HOST';
UPDATE ps_configuration SET value = '11211' WHERE name = 'PS_CACHE_PORT';
EOF

Or use file-based caching:

mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
UPDATE ps_configuration SET value = 'CacheFS' WHERE name = 'PS_CACHING';
EOF

Enable image optimization:

# Install ImageMagick
sudo apt install imagemagick -y

# PrestaShop will use ImageMagick for image processing
# Configure in admin panel: Performance > Image generation

Optimize database:

# Regular maintenance
mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
OPTIMIZE TABLE ps_product;
OPTIMIZE TABLE ps_product_attribute;
OPTIMIZE TABLE ps_category_product;
OPTIMIZE TABLE ps_orders;
OPTIMIZE TABLE ps_order_detail;
OPTIMIZE TABLE ps_cart;
OPTIMIZE TABLE ps_cart_product;
EOF

Cree a maintenance script:

cat > /usr/local/bin/prestashop-maintenance.sh << 'EOF'
#!/bin/bash

# Database optimization
mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << SQL
OPTIMIZE TABLE ps_product;
OPTIMIZE TABLE ps_orders;
OPTIMIZE TABLE ps_cart;
SQL

# Clear unnecessary caches
rm -rf /var/www/prestashop/var/cache/*
rm -rf /var/www/prestashop/var/logs/*

# Archive old logs
gzip /var/log/nginx/prestashop_access.log
gzip /var/log/php8.1-fpm-slow.log

echo "PrestaShop maintenance completed: $(date)" >> /var/log/prestashop-maintenance.log
EOF

sudo chmod +x /usr/local/bin/prestashop-maintenance.sh

Schedule maintenance:

sudo crontab -e

# Add daily maintenance at 2 AM
0 2 * * * /usr/local/bin/prestashop-maintenance.sh

Endurecimiento de seguridad

Implement security best practices to protect your PrestaShop installation.

Change default admin URL:

mysql -u prestashop_user -p "SecurePassword123!" prestashop_db << EOF
UPDATE ps_configuration SET value = 'admin-custom-path' WHERE name = 'PS_ADMIN_FOLDER';
EOF

Update Nginx configuration:

# Update admin location
location ~ ^/admin-custom-path/ {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /admin-custom-path/index.php last;
    }
}

Configure WAF rules:

# Block common attack patterns
if ($request_uri ~* "\.\.") {
    return 403;
}

if ($request_uri ~* "drop database|insert |update |delete |select ") {
    return 403;
}

if ($request_method = "TRACE") {
    return 403;
}

Enable two-factor authentication in admin:

# PrestaShop provides 2FA in admin panel
# Navigate to: Advanced Parameters > Admin > 2FA

Regular backups:

cat > /usr/local/bin/prestashop-backup.sh << 'EOF'
#!/bin/bash

BACKUP_DIR="/backups/prestashop"
SHOP_DIR="/var/www/prestashop"
DB_NAME="prestashop_db"
DB_USER="prestashop_user"
DB_PASS="SecurePassword123!"

mkdir -p $BACKUP_DIR

# Backup database
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db-$(date +%Y%m%d-%H%M%S).sql.gz

# Backup files
tar czf $BACKUP_DIR/files-$(date +%Y%m%d-%H%M%S).tar.gz -C /var/www prestashop

# Keep only 30 days of backups
find $BACKUP_DIR -type f -mtime +30 -delete

echo "PrestaShop backup completed: $(date)" >> /var/log/prestashop-backup.log
EOF

sudo chmod +x /usr/local/bin/prestashop-backup.sh

Schedule backups:

# Run backups daily
sudo crontab -e

0 3 * * * /usr/local/bin/prestashop-backup.sh

Conclusión

PrestaShop installation on Linux requires proper system preparation, correct LEMP stack configuration, and security hardening. This guide covers complete setup from system prerequisites through SSL/TLS implementation and performance optimization. Following these steps creates a robust, secure, and performant PrestaShop store ready for production traffic. Regular maintenance, backups, and monitoring ensure continued reliability and security as your store grows.