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

Pantalla de configuración de Neos

Neos es un sistema de administración de contenido (CMS) gratuito y de código abierto que le permite crear sitios web complejos fácilmente sin necesidad de codificar. Puede crear un blog, un sitio web de noticias, una página de cartera o un sitio web de empresa usándolo. Ofrece un amplio conjunto de funciones, como la edición en línea, admite múltiples sitios web en una sola instalación, herramientas de SEO integradas, URL legibles por humanos, administrador de complementos, vista previa del dispositivo y admite múltiples plantillas. Admite tecnologías modernas como REST API, JSON, GraphQL y oEmbed.

En este tutorial, aprenderá cómo instalar Neos CMS en un servidor que ejecuta el sistema operativo Rocky Linux 8.

requisitos previos

  • Un servidor que ejecuta Rocky Linux 8.
  • Un usuario sudo no root.
  • Asegúrate de que todo esté actualizado.
    $ sudo dnf update
    
  • Instalar 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 usa Firewalld Firewall. Compruebe el estado del cortafuegos.

$ sudo firewall-cmd --state
running

El firewall funciona con diferentes zonas, y la zona pública es la predeterminada que usaremos. Enumere todos los servicios y puertos activos en el firewall.

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

Debería mostrar el siguiente resultado.

cockpit dhcpv6-client ssh

Permitir puertos HTTP y HTTPS.

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

Vuelva a comprobar el estado del cortafuegos.

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

Deberías ver una salida similar.

cockpit dhcpv6-client http https ssh

Vuelva a cargar el firewall para habilitar los cambios.

$ sudo firewall-cmd --reload

Paso 2 – Instalar Nginx

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

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

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

Pegue el siguiente código en él.

[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

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Instala Nginx.

$ sudo dnf install nginx

Verifique la instalación.

$ nginx -v
nginx version: nginx/1.20.2

Habilite e inicie el servicio Nginx.

$ sudo systemctl enable nginx --now

Paso 3 – Instalar PHP y extensiones

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

$ sudo dnf install epel-release

A continuación, instale el repositorio de Remi.

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

Verifique las transmisiones 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 predeterminada es 7.2. Habilite el repositorio PHP 8.0 de Remi.

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

A continuación, instale 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

Verifique 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

Usaremos la base de datos MySQL para almacenar los datos. El repositorio Appstream de Rocky Linux viene con la última versión de MySQL.

Instalar MySQL.

$ sudo dnf install mysql-server

Habilite e inicie el servicio MySQL.

$ sudo systemctl enable mysqld --now

Instalación segura de MySQL.

$ sudo mysql_secure_installation

Para el primer paso, se le preguntará si desea configurar el complemento Validar contraseña, que puede usar para probar la seguridad de su contraseña de MySQL. Elija Y para continuar. Se le pedirá que elija el nivel de validación de la contraseña en el siguiente paso. Elija 2, que es el nivel más fuerte y requerirá que su contraseña tenga al menos ocho caracteres e incluya una combinación 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

Se le pedirá que elija una contraseña de root en el siguiente paso. Elija una contraseña segura que cumpla con los requisitos del complemento de validación de contraseña. En el siguiente paso, se le preguntará si desea continuar con la contraseña elegida. Presione 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

Presione Y y luego la tecla ENTER para todas las indicaciones siguientes para eliminar los usuarios anónimos y la base de datos de prueba, deshabilitar los inicios de sesión raíz 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!

Ingrese el shell de MySQL. Ingrese su contraseña raíz para continuar.

$ mysql -u root -p

Crear usuario neos. Asegúrese de que la contraseña cumpla con los requisitos establecidos anteriormente.

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

Crear base de datos neosdb.

mysql> CREATE DATABASE neosdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Otorgue privilegios de usuario en la base de datos neosdb.

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

Sal de la Concha.

mysql> exit

Paso 5 – Instalar Composer

Composer es una herramienta de administración de dependencias para PHP y Neos CMS lo requiere para funcionar.

Descargue el script de instalación de Composer.

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

Ejecute 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 toman el valor hash del instalador y lo comparan con su script descargado. Debería ver el siguiente resultado si es seguro ejecutar el instalador.

Installer verified

Instalar Compositor.

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

Verifique 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

Cree un directorio raíz para instalar Neos.

$ sudo mkdir -p /var/www/neos

Cambie la propiedad del directorio raíz al usuario actualmente conectado.

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

Cambie al directorio raíz.

$ cd /var/www/neos

Utilice Composer para instalar Neos y sus dependencias.

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

No olvide el punto al final del comando que le dice a Composer que lo instale en el directorio actual. Es posible que reciba las siguientes advertencias durante la instalación. Introduzca 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

Cambie la propiedad del directorio raíz a nginx.

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

Agregue el usuario que ha iniciado sesión actualmente al grupo nginx.

$ sudo usermod -a -G nginx $USER

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

Paso 7: configure los permisos de SELinux

Use el comando chcon de SELinux para cambiar el contexto de seguridad del archivo 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

Configure SELinux para permitir conexiones de red para Neos CMS.

$ sudo setsebool -P httpd_can_network_connect on

Paso 8: instalar y configurar 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 omitir este paso ya que lo instalamos anteriormente en el tutorial.

Instale Certbot.

$ sudo dnf install certbot

Detenga el servidor Nginx ya que interfiere con la herramienta Certbot.

$ sudo systemctl stop nginx

Genere 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 su servidor.

Generar un grupo Diffie-Hellman certificado.

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

Cree un directorio raíz web de desafío para la renovación automática de Let’s Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Cree un trabajo cron para renovar el SSL. Se ejecutará todos los días para verificar el certificado y renovarlo si es necesario. Para eso, primero, cree el archivo /etc/cron.daily/certbot-renew y ábralo para editarlo.

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

Pegue el siguiente código.

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

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Cambie los permisos en el archivo de tareas para que sea ejecutable.

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

Paso 9: configurar Nginx y PHP

Configurar PHP-FPM

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

$ sudo nano /etc/php-fpm.d/www.conf

Necesitamos configurar el usuario/grupo de Unix de procesos PHP para nginx. Busque las líneas user=www-data y group=www-data en el archivo y cámbielas a 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
...

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Inicie el servicio PHP.

$ sudo systemctl start php-fpm

Configurar Nginx

Cree y abra el archivo /etc/nginx/conf.d/neos.conf para editarlo.

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

Pegue el siguiente código en él.

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;
}

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

Guarde el archivo presionando Control + X y entrando Y cuando se le solicite una vez terminado.

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

$ sudo nano /etc/nginx/nginx.conf

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

server_names_hash_bucket_size  64;

Guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

Verifique 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

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

$ sudo systemctl restart nginx

Paso 10 – Instalación completa de Neos

Inicie la URL https://neos.example.com en su navegador y obtendrá la siguiente pantalla de configuración.

Pantalla de configuración de Neos

Haga clic en el ir a configuración botón para proceder. Será redirigido a la pantalla de inicio de sesión.

Pantalla de inicio de sesión de Neos

Ejecute el siguiente comando en la terminal para obtener su 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.

Introduzca la contraseña y haga clic en Acceso para proceder. Neos buscará bibliotecas de imágenes PHP.

Comprobación de Neos PHP

Hacer clic Siguiente para continuar. Se le pedirá que ingrese las credenciales de su base de datos. Ingrese las credenciales creadas en el paso 4. Una vez que se verifiquen las credenciales, obtendrá un Conexión establecida mensaje en la pantalla.

Configuración de la base de datos de Neos

Haga clic en Siguiente para continuar. Se le pedirá que configure una cuenta de administrador. Complete sus datos.

Cuenta de administrador Neos

Hacer clic próximo para proceder. A continuación, se le pedirá que seleccione si desea importar un sitio de demostración o crear uno desde cero. Si desea crear un nuevo sitio desde cero, debe completar ambas casillas. Por ejemplo, si está creando un sitio de noticias, complete los cuadros como se indica. Recuerde, si comienza desde cero, no habrá CSS en el sitio y tendrá que hacerlo usted mismo.

Package Name: Neos.HowtoForgeNews
Site Name: HowtoForgeNews

Para nuestro tutorial, nos limitaremos al sitio de demostración. Para importar un sitio de demostración, deje todos los campos en blanco.

Crear sitio Neos

Hacer clic próximo para proceder. Obtendrá la pantalla de finalización de la configuración.

Configuración exitosa de Neos

Haga clic en Ir al back-end para abrir la pantalla de inicio de sesión del panel de control. Introduzca su nombre de usuario y contraseña y haga clic en Acceso para abrir el panel de administración.

Panel de control Neos

Dado que importamos el sitio de demostración, el primer paso es eliminar el Pruébame página, lo que permite que cualquier persona configure cuentas backend con derechos para editar el sitio web.

Cambiar a la Pruébame página de la barra lateral izquierda y haga clic en el Borrar botón resaltado en la captura de pantalla a continuación.

Eliminación de la página Pruébame de Neos

Haga clic en la flecha de color naranja a la derecha de la Publicado – En vivo para abrir el menú desplegable y haga clic en publicar todo para guardar los cambios.

Cambios de publicación de Neos

Su instalación de Neos CMS está lista para usar.

Conclusión

En este tutorial, instaló y configuró Neos CMS usando una pila LEMP en un servidor basado en Rocky Linux 8. Si tiene alguna pregunta, publíquela en los comentarios a continuación.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *