Instalar y configurar Drupal 8 con Nginx y Let’s Encrypt en CentOS 8

Drupal es un sistema de gestión de contenidos gratuito, de código abierto y escalable que puede ser utilizado por particulares para crear y gestionar cualquier tipo de sitio web. Está escrito en PHP y utiliza MySQL/MariaDB para almacenar sus datos. Drupal proporciona un rico conjunto de funciones que pueden ampliarse con miles de complementos. Drupal es compatible con muchos servidores web, como Apache, Nginx, IIS, Lighttpd y bases de datos MySQL, MariaDB, MongoDB, SQLite, PostgreSQL y MS SQL server. Drupal viene con una interfaz de usuario sencilla y fácil de usar que te permite crear sitios web sin ningún conocimiento de codificación.

En este tutorial, te mostraremos cómo instalar Drupal 8 en un servidor CentOS 8 y asegurarlo con el SSL gratuito de Let’s Encrypt.

Requisitos

  • Un servidor con CentOS 8.
  • Un nombre de dominio válido apuntado con la IP de tu servidor
  • Una contraseña de root configurada en el servidor.

Instalar Nginx, MariaDB y PHP

Antes de empezar, tendrás que instalar el servidor LEMP en tu servidor. Puedes instalarlo ejecutando el siguiente comando:

dnf install nginx mariadb-server php php-fpm php-cli php-mbstring php-gd php-xml php-curl php-mysqlnd php-pdo php-json php-opcache -y

Una vez instalado, inicia el servicio Nginx, MariaDB y php-fpm y habilítalos para que se inicien tras el reinicio del sistema mediante el siguiente comando:

systemctl start nginx
systemctl start php-fpm
systemctl start mariadb
systemctl enable nginx
systemctl enable php-fpm
systemctl enable mariadb

Configurar la base de datos

Por defecto, MariaDB no está asegurada, por lo que tendrás que asegurarla. Puedes asegurarla ejecutando el siguiente comando:

mysql_secure_installation

Responde a todas las preguntas como se muestra a continuación:

Enter current password for root (enter for none):
Set root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

Una vez que hayas terminado, entra en el shell de MariaDB con el siguiente comando:

mysql -u root -p

Proporciona tu contraseña de root cuando se te pida y luego crea una base de datos y un usuario para Drupal con el siguiente comando:

MariaDB [(none)]> CREATE DATABASE drupaldb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
MariaDB [(none)]> CREATE USER [email protected] IDENTIFIED BY "password";

A continuación, concede todos los privilegios a drupaldb con el siguiente comando:

MariaDB [(none)]> GRANT ALL ON drupaldb.* TO [email protected] IDENTIFIED BY "password";

A continuación, vacía los privilegios y sal del shell de MariaDB con el siguiente comando:

MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> EXIT;

Descargar Drupal

En primer lugar, tendrás que descargar la última versión de Drupal desde su sitio web oficial. Puedes descargarla con el siguiente comando:

wget https://ftp.drupal.org/files/projects/drupal-8.7.10.tar.gz

Una vez descargado, extrae el archivo descargado con el siguiente comando:

tar -xvzf drupal-8.7.10.tar.gz

A continuación, mueve el directorio extraído al directorio raíz de la web Nginx con el siguiente comando:

mv drupal-8.7.10 /var/www/html/drupal

A continuación, crea un directorio para almacenar los archivos del sitio web y cambia el nombre del archivo default.settings.php como se muestra a continuación:

mkdir /var/www/html/drupal/sites/default/files
cp /var/www/html/drupal/sites/default/default.settings.php /var/www/html/drupal/sites/default/settings.php

A continuación, cambia la propiedad del directorio de Drupal a nginx como se muestra a continuación:

chown -R nginx:nginx /var/www/html/drupal/

Configurar Nginx para Drupal

Primero, crea un archivo de configuración php-fpm para Drupal con el siguiente comando:

nano /etc/php-fpm.d/drupal.conf

Añade las siguientes líneas:

[drupal]
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen = /run/php-fpm/drupal.sock
pm = ondemand
pm.max_children =  50
pm.process_idle_timeout = 10s
pm.max_requests = 500
chdir = /

Guarda y cierra el archivo cuando hayas terminado. A continuación, crea un archivo de configuración de host virtual Nginx para Drupal:

nano /etc/nginx/conf.d/drupal.conf

Añade las siguientes líneas:

server {
    listen 80;
    server_name example.com;

    root /var/www/html/drupal;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location ~ \..*/.*\.php$ {
        return 403;
    }

    location ~ ^/sites/.*/private/ {
        return 403;
    }

    # Block access to scripts in site files directory
    location ~ ^/sites/[^/]+/files/.*\.php$ {
        deny all;
    }
    location ~ (^|/)\. {
        return 403;
    }

    location / {
        try_files $uri /index.php?$query_string;
    }

    location @rewrite {
        rewrite ^/(.*)$ /index.php?q=$1;
    }
    location ~ /vendor/.*\.php$ {
        deny all;
        return 404;
    }


    location ~ '\.php$|^/update.php' {
        fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
        include fastcgi_params;
       	# Block httpoxy attacks. See https://httpoxy.org/.
        fastcgi_param HTTP_PROXY "";
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/run/php-fpm/drupal.sock;
    }
    location ~ ^/sites/.*/files/styles/ { # For Drupal >= 7
        try_files $uri @rewrite;
    }

    # Handle private files through Drupal. Private file's path can come
    # with a language prefix.
    location ~ ^(/[a-z\-]+)?/system/files/ { # For Drupal >= 7
        try_files $uri /index.php?$query_string;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        try_files $uri @rewrite;
        expires max;
        log_not_found off;
    }
}

Guarda y cierra el archivo. A continuación, reinicia el servicio php-fpm y Nginx para aplicar los cambios:

systemctl restart php-fpm
systemctl restart nginx

Configurar SELinux y el cortafuegos

Por defecto, SELinux está activado en CentOS 8. Así que tendrás que configurar SELinux para que Drupal funcione correctamente.

Primero, permite que Drupal escriba en los directorios de archivos públicos y privados con el siguiente comando:

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/drupal(/.*)?"
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/drupal/sites/default/settings.php'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/drupal/sites/default/files'
restorecon -Rv /var/www/html/drupal
restorecon -v /var/www/html/drupal/sites/default/settings.php
restorecon -Rv /var/www/html/drupal/sites/default/files

A continuación, permite que Drupal envíe correos electrónicos salientes con el siguiente comando:

setsebool -P httpd_can_sendmail on

A continuación, tendrás que crear una regla de firewall para permitir el servicio HTTP y HTTPS desde redes externas. Puedes permitirlo con el siguiente comando:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Asegura Drupal con Let’s Encrypt SSL

Ahora Drupal está instalado y configurado. Es hora de asegurarlo con el SSL gratuito de Let’s Encrypt.

Para ello, necesitarás descargar el cliente certbot en tu servidor. Puedes descargarlo y establecer el permiso correcto ejecutando el siguiente comando:

wget https://dl.eff.org/certbot-auto
mv certbot-auto /usr/local/bin/certbot-auto
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto

Ahora, ejecuta el siguiente comando para obtener e instalar un certificado SSL para tu sitio web de Drupal.

certbot-auto --nginx -d example.com

El comando anterior instalará primero todas las dependencias necesarias en tu servidor. Una vez instalado, se te pedirá que proporciones una dirección de correo electrónico y que aceptes las condiciones del servicio, como se muestra a continuación:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y 


Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/drupal.conf

A continuación, tendrás que elegir si quieres redirigir el tráfico HTTP a HTTPS, como se muestra a continuación:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Escribe 2 y pulsa Enter para continuar. Una vez finalizada la instalación, deberías ver la siguiente salida:

Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/drupal.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2020-03-23. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again with the "certonly" option. To non-interactively renew *all*
   of your certificates, run "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Acceder al sitio web de Drupal

Ahora, abre tu navegador web y escribe la URL https://example.com. Serás redirigido a la siguiente página:

Elige la lengua

Selecciona el idioma que desees y haz clic en el botón Guardar y continuar. Deberías ver la siguiente página:

Selecciona el perfil de instalación

Elige tu perfil de instalación y haz clic en el botón Guardar y continuar. Deberías ver la siguiente página:

Configuración de la base de datos

Proporciona los detalles de tu base de datos y haz clic en el botón Guardar y continuar. Deberías ver la siguiente página:

Configurar el sitio web

Proporciona el nombre de tu sitio, el nombre de usuario del administrador, la contraseña y haz clic en el botón Guardar y continuar. Deberías ver tu panel de control de Drupal en la siguiente página:

Bienvenido a tu sitio Drupal

Enhorabuena! has instalado y asegurado con éxito Drupal en el servidor CentOS 8.

También te podría gustar...