Cómo instalar NEOS CMS con Nginx y Let’s Encrypt SSL en Rocky Linux 8

Neos es un sistema de gestión de contenidos (CMS) gratuito y de código abierto que te permite construir fácilmente sitios web complejos sin necesidad de codificar. Puedes crear un blog, un sitio web de noticias, una página de portafolio o un sitio web de empresa utilizándolo. Ofrece un rico conjunto de funciones como la edición en línea, admite múltiples sitios web en una sola instalación, herramientas SEO integradas, URLs legibles por humanos, gestor de plugins, vista previa de dispositivos y admite múltiples plantillas. Es compatible con tecnologías modernas como la API REST, JSON, GraphQL y oEmbed.

En este tutorial, aprenderás a instalar Neos CMS en un servidor con el sistema operativo Rocky Linux 8.

Requisitos previos

  • Un servidor con Rocky Linux 8.

  • Un usuario sudo no root.

  • Asegúrate de que todo está actualizado.

    $ sudo dnf update
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.

    $ sudo dnf install wget curl nano unzip yum-utils -y
    

Paso 1 – Configurar el cortafuegos

El primer paso es configurar el cortafuegos. Rocky Linux utiliza el cortafuegos Firewalld. Comprueba el estado del cortafuegos.

$ sudo firewall-cmd --state
running

El cortafuegos funciona con diferentes zonas, y la zona pública es la que utilizaremos por defecto. Enumera todos los servicios y puertos activos en el cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Debería mostrar el siguiente resultado.

cockpit dhcpv6-client ssh

Permite los puertos HTTP y HTTPS.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Vuelve a comprobar el estado del cortafuegos.

$ sudo firewall-cmd --permanent --list-services

Deberías ver una salida similar.

cockpit dhcpv6-client http https ssh

Recarga el cortafuegos para activar los cambios.

$ sudo firewall-cmd --reload

Paso 2 – Instalar Nginx

Rocky Linux viene con una versión antigua de Nginx. Necesitas descargar el repositorio oficial de Nginx para instalar la última versión.

Crea y abre el archivo /etc/yum.repos.d/nginx.repo para crear el repositorio oficial de Nginx.

$ sudo nano /etc/yum.repos.d/nginx.repo

Pega en él el siguiente código.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

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

Instala Nginx.

$ sudo dnf install nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.20.2

Activa e inicia el servicio Nginx.

$ sudo systemctl enable nginx --now

Paso 3 – Instalar PHP y las extensiones

Para nuestro tutorial, necesitamos instalar la última versión de PHP utilizando el repositorio de Remi. El primer paso es coger el repositorio de Epel.

$ sudo dnf install epel-release

A continuación, instala el repositorio de Remi.

$ sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Comprueba si hay versiones de PHP disponibles.

$ dnf module list php -y
Last metadata expiration check: 0:00:12 ago on Fri 03 Dec 2021 09:39:32 AM UTC.
Rocky Linux 8 - AppStream
Name                Stream                 Profiles                                 Summary
php                 7.2 [d]                common [d], devel, minimal               PHP scripting language
php                 7.3                    common [d], devel, minimal               PHP scripting language
php                 7.4                    common [d], devel, minimal               PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                Stream                 Profiles                                 Summary
php                 remi-7.2               common [d], devel, minimal               PHP scripting language
php                 remi-7.3               common [d], devel, minimal               PHP scripting language
php                 remi-7.4               common [d], devel, minimal               PHP scripting language
php                 remi-8.0               common [d], devel, minimal               PHP scripting language
php                 remi-8.1               common [d], devel, minimal               PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

La versión por defecto es la 7.2. Activa el repositorio PHP 8.0 de Remi.

$ sudo dnf module reset php
$ sudo dnf module enable php:remi-8.0

A continuación, instala PHP y sus extensiones requeridas por Neos junto con ImageMagick.

$ sudo dnf install php-fpm php-mbstring php-xml php-curl php-mysqlnd php-zip php-cli php-imagick ImageMagick php-intl

Verifica la instalación.

$ php --version
PHP 8.0.14 (cli) (built: Dec 16 2021 03:01:07) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.14, Copyright (c) Zend Technologies

Paso 4 – Instalar y configurar el servidor MySQL

Utilizaremos la base de datos MySQL para almacenar los datos. El repositorio Appstream de Rocky Linux incluye la última versión de MySQL.

Instala MySQL.

$ sudo dnf install mysql-server

Habilita e inicia el servicio MySQL.

$ sudo systemctl enable mysqld --now

Asegura la instalación de MySQL.

$ sudo mysql_secure_installation

En el primer paso, se te preguntará si quieres configurar el Plugin de Validación de Contraseñas, que puedes utilizar para comprobar la solidez 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.

Connecting to MySQL using a blank password.

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 pedirá que elijas una contraseña de root. Elige una contraseña fuerte que cumpla los requisitos del plugin de validación de contraseñas. En el siguiente paso, se te preguntará si quieres continuar con la contraseña elegida. Pulsa y para continuar.

Please set the password for root here.

New password:

Re-enter new password:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

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 neos. Asegúrate de que la contraseña cumple los requisitos establecidos anteriormente.

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

Crea la base de datos neosdb.

mysql> CREATE DATABASE neosdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Concede al usuario privilegios en la base de datos neosdb.

mysql> GRANT ALL PRIVILEGES ON neosdb.* TO 'neos'@'localhost';

Sal de la Shell.

mysql> exit

Paso 5 – Instalar Composer

Composer es una herramienta de gestión de dependencias para PHP y es necesaria para que Neos CMS funcione.

Descarga el script de instalación de Composer.

$ curl -sS https://getcomposer.org/installer -o composer-setup.php

Ejecuta los siguientes comandos para verificar el instalador.

$ HASH=`curl -sS https://composer.github.io/installer.sig`
$ echo $HASH
$ php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Los comandos anteriores obtienen el valor hash del instalador y lo comparan con el script que has descargado. Deberías ver la siguiente salida si el instalador es seguro de ejecutar.

Installer verified

Instalar Composer.

$ sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

Verifica la instalación comprobando su versión.

$ composer --version
Composer version 2.2.3 2021-12-31 12:18:53

Paso 6 – Instalar Neos CMS

Crea un directorio raíz para instalar Neos.

$ sudo mkdir -p /var/www/neos

Cambia la propiedad del directorio raíz al usuario que ha iniciado la sesión.

$ sudo chown -R $USER:$USER /var/www/neos

Cambia al directorio raíz.

$ cd /var/www/neos

Utiliza Composer para instalar Neos y sus dependencias.

$ composer create-project --no-dev neos/neos-base-distribution .

No olvides el punto al final del comando que indica a Composer que lo instale en el directorio actual. Es posible que aparezcan las siguientes advertencias durante la instalación. Introduce y para continuar. La instalación no se verá obstaculizada por ello.

 - Installing neos/composer-plugin (2.1.3): Extracting archive
neos/composer-plugin contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins
Do you trust "neos/composer-plugin" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] y

  - Installing composer/package-versions-deprecated (1.11.99.4): Extracting archive
composer/package-versions-deprecated contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins
Do you trust "composer/package-versions-deprecated" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?] y

Cambia la propiedad del directorio raíz a nginx.

$ sudo ./flow core:setfilepermissions $USER nginx nginx

Añade el usuario actualmente conectado al grupo nginx.

$ sudo usermod -a -G nginx $USER

Eso es todo por ahora. Más adelante realizaremos las configuraciones restantes.

Paso 7 – Configurar los permisos de SELinux

Utiliza el comando chcon de SELinux para cambiar el contexto de seguridad de los archivos para el contenido web que se sirve desde el directorio /var/www/neos.

$ sudo chcon -t httpd_sys_content_t /var/www/neos -R
$ sudo chcon -t httpd_sys_rw_content_t /var/www/neos -R

Configura SELinux para permitir las conexiones de red para el Neos CMS.

$ sudo setsebool -P httpd_can_network_connect on

Paso 8 – Instalar y configurar el SSL

Para instalar un certificado SSL usando Let’s Encrypt, necesitamos descargar la herramienta Certbot. Necesitamos el repositorio de Epel para instalar Certbot, pero podemos saltarnos este paso ya que lo hemos instalado antes en el tutorial.

Instala Certbot.

$ sudo dnf install certbot

Detén el servidor Nginx ya que interfiere con la herramienta Certbot.

$ sudo systemctl stop nginx

Genera un certificado SSL.

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

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/neos.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 raíz web 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 neos.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 9 – Configurar Nginx y PHP

Configurar PHP-FPM

Abre el archivo /etc/php-fpm.d/www.conf.

$ sudo nano /etc/php-fpm.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.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...

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

Inicia el servicio PHP.

$ sudo systemctl start php-fpm

Configura Nginx

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

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

Pega en él el siguiente código.

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

    access_log  /var/log/nginx/neos.access.log;
    error_log   /var/log/nginx/neos.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/neos.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/neos.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/neos.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/neos/Web/;
    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-fpm/www.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;
        fastcgi_param FLOW_REWRITEURLS  1;
	fastcgi_param FLOW_CONTEXT  Production;
    	fastcgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
	fastcgi_param X-Forwarded-Port $proxy_port;
    	fastcgi_param REMOTE_ADDR $remote_addr;
	fastcgi_param REMOTE_PORT $remote_port;
    	fastcgi_param SERVER_ADDR $server_addr;
	fastcgi_param SERVER_NAME $http_host;
        fastcgi_read_timeout 300;
	fastcgi_buffer_size  128k;
    	fastcgi_buffers  256 16k;
	fastcgi_busy_buffers_size 256k;
    	fastcgi_temp_file_write_size 256k;
        include fastcgi_params;
        try_files $uri =404;
    }

    location ~ /_Resources/ {
   	access_log off;
	log_not_found off;
	expires max;

    	if (!-f $request_filename) {
    		rewrite "/_Resources/Persistent/([a-z0-9]{40})/.+\.(.+)" /_Resources/Persistent/$1.$2 break;
     		rewrite "/_Resources/Persistent(?>/[a-z0-9]{5}){8}/([a-f0-9]{40})/.+\.(.+)" /_Resources/Persistent/$1.$2 break;
    	}
    }
}

# enforce HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  neos.example.com;
    return 301   https://$host$request_uri;
}

Observa que el directorio raíz que se utilizará en la configuración de Nginx es /var/www/neos/Web/ y no /var/www/neos/.

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

Reinicia el servicio Nginx para activar la nueva configuración.

$ sudo systemctl restart nginx

Paso 10 – Completa la instalación de Neos

Inicia la URL https://neos.example.com en tu navegador, y obtendrás la siguiente pantalla de configuración.

Pantalla de configuración de Neos

Haz clic en el botón Ir a la configuración para continuar. Serás redirigido a la pantalla de inicio de sesión.

Pantalla de inicio de sesión de Neos

Ejecuta el siguiente comando en el terminal para obtener tu contraseña.

$ cat /var/www/neos/Data/SetupPassword.txt
The setup password is:

SCPUYmmQ

After you successfully logged in, this file is automatically deleted for security reasons.
Make sure to save the setup password for later use.

Introduce la contraseña y haz clic en Iniciar sesión para continuar. Neos comprobará si hay bibliotecas de imágenes PHP.

Neos PHP Check

Haz clic en Siguiente para continuar. Se te pedirá que introduzcas tus credenciales de la base de datos. Introduce las credenciales creadas en el paso 4. Una vez verificadas las credenciales, aparecerá un mensaje deConexión establecida en la pantalla.

Configuración de la base de datos Neos

Haz clic en Siguiente para continuar. Se te pedirá que configures una cuenta de administrador. Introduce tus datos.

Cuenta de administrador de Neos

Haz clic en Siguiente para continuar. A continuación, se te pedirá que selecciones si quieres importar un sitio de demostración o crear uno desde cero. Si quieres crear un nuevo sitio desde cero, debes rellenar ambas casillas. Por ejemplo, si vas a crear un sitio de noticias, rellena las casillas como se indica. Recuerda que si empiezas desde cero, no habrá CSS en el sitio, y tendrás que hacerlo tú mismo.

Package Name: Neos.HowtoForgeNews
Site Name: HowtoForgeNews

Para nuestro tutorial, nos ceñiremos al sitio de demostración. Para importar un sitio de demostración, deja todos los campos en blanco.

Neos Site Create

Haz clic en Siguiente para continuar. Aparecerá la pantalla de finalización de la configuración.

Configuración exitosa de Neos

Haz clic en el botón Ir al backend para abrir la pantalla de inicio de sesión del panel de control. Introduce tu nombre de usuario y contraseña y haz clic en Iniciar sesión para abrir el panel de administración.

Neos Control Panel

Como hemos importado el sitio de demostración, el primer paso es eliminar la página Pruébame, permitiendo que cualquiera pueda crear cuentas de backend con derechos para editar el sitio web.

Cambia a la página Pruébame desde la barra lateral izquierda y haz clic en el botón Eliminar resaltado en la siguiente captura de pantalla.

Neos Try Me Page Delete

Haz clic en la flecha de color naranja a la derecha del botónPublicado – En vivo para abrir el menú desplegable y haz clic en Publicar todo para guardar los cambios.

Neos Publicar cambios

Tu instalación de Neos CMS está lista para ser utilizada.

Conclusión

En este tutorial, has instalado y configurado Neos CMS utilizando una pila LEMP en un servidor basado en Rocky Linux 8. Si tienes alguna pregunta, publícala en los comentarios de abajo.

También te podría gustar...