Cómo instalar AbanteCart con Nginx y SSL en Debian 11

Abantecart es una aplicación de comercio electrónico gratuita, de código abierto y con muchas funciones. Está escrita en PHP y cuenta con las últimas tecnologías como HTML5, Bootstrap, MVC y otras. Puede crear varias tiendas online con una sola instalación, con soporte para productos digitales y físicos, integración con varias pasarelas de pago y divisas, varios idiomas, cupones, créditos para la tienda y un panel de control para los clientes. Puedes realizar una campaña de marketing por correo electrónico a través de ella o crear banners para aumentar el compromiso de los usuarios. Además, está optimizado para el SEO con soporte para URLs amigables, se integra con múltiples plataformas de análisis y soporta plugins.

En este tutorial, aprenderás a instalar Abantecart en un servidor basado en Debian 11.

Requisitos previos

  • Un servidor con Debian 11.

  • Un usuario no root con privilegios sudo.

  • Todo actualizado.

    $ sudo apt update && sudo apt upgrade
    
  • Pocos paquetes que necesite tu sistema.

    $ sudo apt install wget curl nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release unzip debian-archive-keyring -y
    

    Algunos de estos paquetes pueden estar ya instalados en tu sistema.

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Debian viene con ufw (Uncomplicated Firewall).

Comprueba si el cortafuegos se está ejecutando.

$ sudo ufw status

Deberías obtener el siguiente resultado.

Status: inactive

Permite el puerto SSH para que el cortafuegos no rompa la conexión actual al activarlo.

$ sudo ufw allow OpenSSH

Permite también los puertos HTTP y HTTPS.

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Habilita el cortafuegos

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

Comprueba de nuevo el estado del cortafuegos.

$ sudo ufw status

Deberías ver una salida similar.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)

Paso 2 – Instalar PHP

Abantecart soporta PHP 8.0. Para instalarlo, utilizaremos el repositorio PHP de Ondrej. Ejecuta el siguiente comando para añadir el repositorio.

$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list

Añade la clave GPG asociada al repositorio.

$ wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -

Actualiza los repositorios de Debian.

$ sudo apt update

Instala PHP 8.0 y las extensiones necesarias.

$ sudo apt install php8.0-cli php8.0-fpm php8.0-mysql php8.0-gd php8.0-common php8.0-curl php8.0-xml php8.0-mbstring

Paso 3 – Instalar MySQL

Para instalar el servidor MySQL, el primer paso es añadir la clave GPG del paquete

Hay un error en Debian por el que tienes que ejecutar el comando GPG por separado para configurar el directorio .gpg.

$ sudo gpg

Pulsa Ctrl + C para salir del comando anterior. Importa la clave GPG y guárdala en el directorio /usr/share/keyrings.

$ sudo gpg --no-default-keyring --keyring /usr/share/keyrings/mysql8.0-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --brecv-keys 3A79BD29

Añade el repositorio oficial de MySQL.

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mysql8.0-archive-keyring.gpg] http://repo.mysql.com/apt/debian/ `lsb_release -cs` mysql-8.0" \
    | sudo tee /etc/apt/sources.list.d/mysql-8.list

Actualiza los repositorios de Debian.

$ sudo apt update

Instala MySQL.

$ sudo apt install mysql-server

Aparecerá una pantalla de configuración que te pedirá que establezcas una contraseña de root. Elige una contraseña fuerte.

Configuración de la contraseña raíz de MySQL

Se te pedirá que confirmes la contraseña. A continuación, aparecerá una pantalla que describe el nuevo sistema de autenticación. Selecciona Aceptar para continuar.

Información de autenticación de MySQL

Por último, se te pedirá que selecciones el método de autenticación. Escoge el Cifrado de Contraseña Fuerte y selecciona Aceptar para finalizar la configuración.

Petición de autentificación de la contraseña de MySQL

Paso 4 – Instalar Nginx

Debian incluye una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Importa la clave de firma oficial de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
	 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Añade el repositorio de la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
    http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios de Debian.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación. Asegúrate de utilizar sudo cada vez que ejecutes el comando Nginx en Debian. De lo contrario, no funcionará.

$ sudo nginx -v
nginx version: nginx/1.20.2

Activa el servicio Nginx.

$ sudo systemctl enable nginx

Paso 5 – Configurar MySQL para AbanteCart

Asegura la instalación de MySQL.

$ sudo mysql_secure_installation

En el primer paso, se te pedirá la contraseña de root. A continuación, se te preguntará si quieres configurar el Plugin de Validación de Contraseñas, con el que podrás comprobar la fortaleza de tu contraseña de MySQL. Elige Y para proceder. Se te pedirá que elijas el nivel de validación de la contraseña en el siguiente paso. Elige 2 que es el nivel más fuerte y requerirá que tu contraseña tenga al menos ocho caracteres e incluya una mezcla de mayúsculas, minúsculas, números y caracteres especiales.

Securing the MySQL server deployment.

Enter password for user root:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

En el siguiente paso, se te preguntará si quieres cambiar la contraseña de root o no. Pulsa N para continuar.

Using existing password for root.
Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : N

Pulsa Y y luego ENTER para todas las siguientes indicaciones para eliminar los usuarios anónimos y la base de datos de prueba, desactivar los inicios de sesión de root y cargar las reglas recién establecidas.

...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.
...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.
...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.
 - Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
...
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
All done!

Entra en el shell de MySQL. Introduce la contraseña de root para continuar.

$ mysql -u root -p

Crea el usuario abcart. Asegúrate de que la contraseña cumple los requisitos establecidos anteriormente.

mysql> CREATE USER 'abcart'@'localhost' IDENTIFIED BY 'Your_password2';

Crea la base de datos abantecart.

mysql> CREATE DATABASE abantecart;

Concede al usuario privilegios en la base de datos abantecart.

mysql> GRANT ALL PRIVILEGES ON abantecart.* TO 'abcart'@'localhost';

Salir de la Shell.

mysql> exit

Paso 6 – Instalar AbanteCart

Descarga la última versión de AbanteCart desde Github.

$ wget https://github.com/abantecart/abantecart-src/archive/master.zip

Extrae el archivo.

$ unzip master.zip

Crea el directorio raíz de la web pública para Abantecart.

$ sudo mkdir /var/www/html/abantecart -p

Copia el directorio extraído abantecart-src-master/public_html al directorio webroot. Ten en cuenta la barra diagonal(/) al final del siguiente comando.

$ sudo cp -r abantecart-src-master/public_html /var/www/html/abantecart/

Establece los permisos adecuados para el directorio webroot.

$ sudo chown -R nginx:nginx /var/www/html/abantecart

Por ahora, la instalación básica está terminada. A continuación, tenemos que configurar SSL y Nginx antes de terminar la instalación.

Paso 7 – Instalar SSL

Para instalar un certificado SSL con Let’s Encrypt, necesitamos instalar la herramienta Certbot.

Para ello utilizaremos el instalador de paquetes Snapd. Como la mayoría de los servidores de Debian no lo incluyen, instala Snap.

$ sudo apt install snapd

Asegúrate de que tu versión de Snapd está actualizada.

$ sudo snap install core && sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Utiliza el siguiente comando para asegurarte de que el comando Certbot puede ejecutarse creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Verifica la instalación.

$ certbot --version
certbot 1.22.0

Genera el certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d abantecart.example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/abantecart.example.com de tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crea un directorio webroot de desafío para la renovación automática de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crea un Cron Job para renovar el SSL. Se ejecutará cada día para comprobar el certificado y renovarlo si es necesario. Para ello, primero crea el archivo /etc/cron.daily/certbot-renew y ábrelo para editarlo.

$ sudo nano /etc/cron.daily/certbot-renew

Pega el siguiente código.

#!/bin/sh
certbot renew --cert-name abantecart.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Cambia los permisos del archivo de la tarea para que sea ejecutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Paso 8 – Configurar Nginx y PHP

Configurar PHP-FPM

Abre el archivo /etc/php/8.0/fpm/pool.d/www.conf.

$ sudo nano /etc/php/8.0/fpm/pool.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=www-data y group=www-data en el archivo y cámbialas por nginx.

...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = nginx
group = nginx
...

Además, busca las líneas listen.owner=www-data y listen.group=www-data en el archivo y cámbialas por nginx.

listen.owner = nginx
listen.group = nginx

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

El siguiente paso es desactivar la extensión PHP opcache.

Abre el archivo /etc/php/8.0/fpm/conf.d/10-opcache.ini para editarlo.

$ sudo nano /etc/php/8.0/fpm/conf.d/10-opcache.ini

Pega la siguiente línea al final.

opcache.enable=0

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Reinicia el proceso PHP-fpm.

$ sudo systemctl restart php8.0-fpm

Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/abantecart.conf para editarlo.

$ sudo nano /etc/nginx/conf.d/abantecart.conf

Pega en él el siguiente código.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  abantecart.example.com;

    access_log  /var/log/nginx/abantecart.access.log;
    error_log   /var/log/nginx/abantecart.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/abantecart.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/abantecart.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/abantecart.example.com/chain.pem;
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;
    
    root /var/www/html/abantecart;
    index index.php;
    
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    # Pass PHP Scripts To FastCGI Server
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock; # Depends On The PHP Version
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
        try_files $uri =404;
    }
    
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    
    # Make sure files with the following extensions do not get loaded by nginx because nginx would
    # display the source code, and these files can contain PASSWORDS!
    location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
        deny all;
    }
    
    # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
    
    ### Retina images handler. Check cookie and looking for file with @2x at the end of name
    location ~* ^(.*)\.(jpg|jpeg|png|gif|webp)$ {
        set $hidpi_uri $1@2x.$2;
        if ($http_cookie !~ 'HTTP_IS_RETINA=1') {
          break;
        }
        try_files $hidpi_uri $uri =404;
    }

    location ~*  \.(jpg|jpeg|png|gif|css|js|ico|webp)$ {
        expires max;
        log_not_found off;
    }
    
    location ~ /(system/logs|resources/download) {
      deny all;
      return 403;
    }
    
    location /admin/ {
        location ~ .*\.(php)?$ {
          deny all;
          return 403;
        }
    }
    
    #rewrite for images for retina-displays
    location ~ / {
        if (!-e $request_filename){
            rewrite ^/(.*)\?*$ /index.php?_route_=$1 last;
        }
    }
}
# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  abantecart.example.com;
    return 301   https://$host$request_uri;
}

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida una vez que hayas terminado.

Abre el archivo /etc/nginx/nginx.conf para editarlo.

$ sudo nano /etc/nginx/nginx.conf

Añade la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Verifica la sintaxis del archivo de configuración de Nginx.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Inicia el servicio Nginx para habilitar la nueva configuración.

$ sudo systemctl start nginx

Paso 9 – Finaliza la instalación

Inicia https://abantecart.example.com en tu navegador, y se te presentará la siguiente pantalla.

Pantalla de licencia de AbanteCart

Marca la casilla que indica que estás de acuerdo con la licencia y pulsa Continuar para proseguir. A continuación, el instalador comprobará si se cumplen o no todos los requisitos.

AbanteCart Comprobación de los requisitos del sistema

Si todo está bien, pulsa Continuar para pasar a la siguiente página.

Se te pedirá que rellenes las credenciales de la base de datos. Aquí puedes crear una cuenta de administrador y una clave de seguridad para acceder al panel de control. Si quieres datos de demostración, mantén la casilla marcada; de lo contrario, déjala sin marcar si quieres empezar desde cero.

Configuración de la base de datos de AbanteCart

Pulsa Continuar para proceder cuando hayas terminado. El instalador procederá a configurar todo y, una vez terminado, te presentará la siguiente pantalla.

Pantalla de finalización de la instalación de AbanteCart

Marca el enlace a tu panel de control porque lo necesitarás. Ejecuta el siguiente comando para eliminar los archivos del instalador porque no son necesarios y suponen un riesgo para la seguridad.

$ sudo rm -rf /var/www/html/abantecart/install

Panel de control de AbanteCart

Accede al panel de control y se te pedirá que termines de configurar tu tienda.

Asistente de configuración de la tienda AbanteCart

Puedes cerrar el asistente rápido y configurarlo desde el panel de control que se muestra a continuación, o continuar con el asistente para configurar los parámetros básicos.

Panel de control de AbanteCart

Conclusión

Con esto concluye nuestro tutorial sobre la configuración de AbanteCart en un servidor basado en Debian 11. Si tienes alguna pregunta, publícala en los comentarios de abajo.

Scroll al inicio