Tutorial

Cómo instalar y configurar una pila LEMP usando Software Collections en CentOS 7

NginxCentOSPHPGetting StartedMariaDBLEMPDatabases

El autor seleccionó la Apache Software Foundation para recibir una donación de $100 como parte del programa Write for DOnations.

Introducción

Una pila de software LEMP es un grupo de software de código abierto que se instala normalmente en conjunto para permitir que un servidor hospede sitios web dinámicos y aplicaciones web. Este término es realmente un acrónimo que representa el sistema operativo de Linux y el servidor web de ENginx (que sustituye al componente Apache de una pila LAMP). Los datos del sitio se almacenan en una base de datos de MySQL (utilizando MariaDB) y el contenido dinámico se procesa mediante PHP.

Los componentes de pilas LEMP a veces se instalan usando el repositorio de EPEL de CentOS 7. Sin embargo, este repositorio contiene paquetes obsoletos. Por ejemplo, no puede instalar ninguna versión de PHP superior a la 5.4.16 desde EPEL, aunque no exista soporte para esta versión desde hace mucho tiempo. Para obtener las versiones más recientes del software, se recomienda que utilice Software Collections, también conocido como “SCLs”. Las SCL son recopilaciones de recursos para desarrolladores proporcionadas por RedHat que le permiten usar varias versiones de software en el mismo sistema sin afectar paquetes previamente instalados.

En esta guía, instalará una pila LEMP en un servidor de CentOS 7. El sistema operativo CentOS se ocupa del componente Linux. Instalará el resto de los componentes usando el repositorio de Software Collections y luego podrá configurarlos para una página web simple.

Requisitos previos

Antes de iniciar este tutorial, debe configurar el servidor de CentOS 7 siguiendo la guía de configuración inicial del servidor de CentOS 7 e incluir un usuario sudo no root.

Paso 1: Habilitación del repositorio de Software Collections

Si desea obtener acceso a SCLs para CentOS, instale el archivo de versión de Linux Software Collections de CentOS:

  • sudo yum install centos-release-scl

Consulte la lista de paquetes SCL disponibles usando el siguiente comando:

  • yum --disablerepo='*' --enablerepo='centos-sclo-rh' --enablerepo='centos-sclo-sclo' list available

Para evitar conflictos en todo el sistema, los paquetes SCL se instalan en el directorio /opt/rh. Esto le permite, por ejemplo, instalar Python 3.5 en una máquina con CentOS 7 sin eliminar Python 2.7 ni interferir con su funcionamiento.

Todos los archivos de configuración para paquetes de SCLs se almacenan en el directorio correspondiente dentro del directorio /etc/opt/rh/. Los paquetes de SCLs proporcionan scripts de shell que definen las variables de entorno necesarias para usar las aplicaciones incluidas. Por ejemplo, PATH, LD_LIBRARY_PATH y MANPATH. Estos scripts se almacenan en el sistema de archivos como /opt/rh/nombre del paquete/enable.

Con esto, estará listo para comenzar a instalar los paquetes indicados en esta guía.

Paso 2: Instalación del servidor web Nginx

Para mostrar páginas web a los visitantes vamos a emplear Nginx, un servidor web moderno y eficiente.

Instale Nginx usando el siguiente comando yum. Asegúrese de sustituir el valor resaltado por la versión de Nginx que desee instalar; el número más alto en el nombre del paquete corresponderá a la versión más reciente (112 en el momento en que se redactó este artículo):

  • sudo yum install rh-nginx112

Una vez terminada la instalación, inicie el servicio Nginx:

  • sudo systemctl start rh-nginx112-nginx

Confirme que Nginx esté en ejecución ingresando el comando systemctl status:

  • sudo systemctl status rh-nginx112-nginx
Output
● rh-nginx112-nginx.service - The nginx HTTP and reverse proxy server Loaded: loaded (/usr/lib/systemd/system/rh-nginx112-nginx.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-19 15:15:43 UTC; 1min 17s ago Main PID: 10556 (nginx) CGroup: /system.slice/rh-nginx112-nginx.service ├─10556 nginx: master process /opt/rh/rh-nginx112/root/usr/sbin/nginx ├─10557 nginx: worker process └─10558 nginx: worker process Mar 19 15:15:43 lemp-centos-222 systemd[1]: Starting The nginx HTTP and reverse proxy server... Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: the configuration file /etc/opt/rh/rh-nginx... ok Mar 19 15:15:43 lemp-centos-222 nginx-scl-helper[10541]: nginx: configuration file /etc/opt/rh/rh-nginx112/...ful Mar 19 15:15:43 lemp-centos-222 systemd[1]: Started The nginx HTTP and reverse proxy server. Hint: Some lines were ellipsized, use -l to show in full.

En este momento, su servidor podría estar expuesto a accesos por parte de usuarios no autorizados. Para corregir esto, configure un firewall usando firewalld. Quizá necesite instalar primero firewalld. Puede hacerlo con el siguiente comando:

  • sudo yum install firewalld

Luego, inicie el servicio firewalld:

  • sudo systemctl start firewalld

A continuación, añada algunas reglas de firewall para permitir el acceso de SSH a su servidor y conexiones HTTP y HTTPS con Nginx:

  • sudo firewall-cmd --permanent --add-service=ssh
  • sudo firewall-cmd --zone=public --permanent --add-service=http
  • sudo firewall-cmd --zone=public --permanent --add-service=https

Vuelva a cargar firewalld para implementar las nuevas reglas de firewall:

  • sudo firewall-cmd --reload

Encontrará más información sobre firewalld en la sección Cómo configurar un firewall usando FirewallD en CentOS 7.

Una vez agregadas estas nuevas reglas, podrá probar si el servidor se encuentra en ejecución accediendo al nombre de dominio o a la dirección IP pública de su servidor en su navegador web.

Si no tiene un nombre de dominio para su servidor y no conoce la dirección IP pública de este, puede encontrarla escribiendo lo siguiente en su terminal:

  • curl -4 icanhazip.com

Escriba la dirección IP resultante en la barra de dirección de su navegador web. Con esto, deberá poder ver la página de inicio predeterminada de Nginx:

http://server_domain_or_IP

Página predeterminada de Nginx

Si ve esta página, significa que instaló Nginx correctamente. Antes de continuar, habilite Nginx para que comience a funcionar en el inicio usando el siguiente comando:

  • sudo systemctl enable rh-nginx112-nginx

El servidor Nginx ya está instalado. Ahora puede proceder a instalar el software de base de datos MariaDB.

Paso 3: Instalación de MariaDB para gestionar datos de sitios

Ahora que contamos con un servidor web, es el momento de instalar MariaDB, un reemplazo a medida de MySQL, para almacenar y administrar los datos de su sitio.

Instale MariaDB con el comando que se muestra a continuación. Una vez más, reemplace el valor señalado por el número de versión que desee instalar; el número más alto corresponde a la versión más reciente disponible (102, en el momento en que se redactó este artículo):

  • sudo yum install rh-mariadb102

Una vez que se complete la instalación, inicie el servicio MariaDB con el siguiente comando:

  • sudo systemctl start rh-mariadb102-mariadb

Con esto, MariaDB quedará instalado y en funcionamiento. No obstante, faltará completar su configuración.

Para proteger la instalación, MariaDB incorpora un script de seguridad que solicita modificar algunos ajustes no seguros predeterminados. Ejecute el script escribiendo lo siguiente:

  • source /opt/rh/rh-mariadb102/enable
  • mysql_secure_installation

El mensaje solicitará su contraseña root actual. Puesto que acaba de instalar MySQL, es probable que no disponga de una. Podrá dejar el campo en blanco presionando ENTER. Luego se le preguntará si desea configurar una contraseña root. Introduzca Y y siga las instrucciones:

. . .
Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorization.

Set root password? [Y/n] Y
New password: password
Re-enter new password: password
Password updated successfully!
Reloading privilege tables..
 ... Success!
. . .

Para el resto de las preguntas, presione la tecla ENTER en cada mensaje para aceptar los valores predeterminados. Con esto, se eliminarán algunos usuarios anónimos y la base de datos de prueba, se deshabilitarán las credenciales de inicio de sesión remoto de root y se cargarán estas nuevas reglas para que MariaDB aplique de inmediato los cambios que realizamos.

Lo último que se debe hacer aquí es habilitar MariaDB para que se ejecute en el inicio. Utilice el siguiente comando para hacerlo:

  • sudo systemctl enable rh-mariadb102-mariadb

En este punto, su sistema de base de datos estará configurado y podrá proceder a configurar PHP en su servidor.

Paso 4: Instalación y configuración de PHP para procesamiento

Ya tiene instalados Nginx para sus páginas y MariaDB para el almacenamiento y la administración de sus datos. Sin embargo, aún le falta instalar una herramienta que pueda generar contenido dinámico. Es el momento de PHP.

Dado que Nginx no contiene procesamiento PHP nativo como otros servidores web, deberá instalar php-fpm, que significa “administrador de proceso de fastCGI”. Más adelante, configurará Nginx para que transmita solicitudes PHP a este software para su procesamiento.

Instale este módulo y también use un paquete helper que permitirá la comunicación de PHP con el backend de su base de datos. La instalación extraerá los archivos principales de PHP necesarios. Podrá ejecutarla escribiendo lo siguiente:

  • sudo yum install rh-php71-php-fpm rh-php71-php-mysqlnd

De esta manera, sus componentes PHP quedarán instalados. Sin embargo, existe un ligero cambio de configuración que debería realizar para reforzar la seguridad de su configuración.

Abra el archivo de configuración de php.ini principal con privilegios root:

  • sudo vi /etc/opt/rh/rh-php71/php.ini

En este archivo, busque el parámetro que configura cgi.fix_pathinfo. Este se comentará con un punto y coma (;) y se fijará en “1” por defecto.

Este ajuste es extremadamente inseguro porque indica a PHP que intente ejecutar el archivo más cercano que pueda encontrar si no se puede hallar el archivo PHP solicitado. Básicamente, esto permitiría a los usuarios realizar solicitudes PHP de una forma que haría posible la ejecución scripts que no deberían poder ejecutar.

Cambie ambas condiciones eliminando los comentarios de la línea y fijando su valor en “0”, como se muestra aquí:

71/php.ini’>/etc/opt/rh/rh-php71/php.ini
cgi.fix_pathinfo=0

Guarde y cierre el archivo cuando termine (presione ESC, ingrese :wq y luego presione Enter).

A continuación, abra el archivo de configuración de php-fpm www.conf:

  • sudo vi /etc/opt/rh/rh-php71/php-fpm.d/www.conf

Por defecto, este archivo está configurado para usarse con el servidor Apache. Dado que su servidor tiene Nginx instalado, encuentre las líneas que configuran user y group y cambie sus valores de “apache” a “nginx”:

71/php-fpm.d/www.conf’>/etc/opt/rh/rh-php71/php-fpm.d/www.conf
user = nginx
group = nginx

Luego, guarde y cierre el archivo.

A continuación, inicie su procesador PHP escribiendo lo siguiente:

  • sudo systemctl start rh-php71-php-fpm

Luego habilite php-fpm para que se ejecute en el inicio:

  • sudo systemctl enable rh-php71-php-fpm

Con esto, PHP quedará correctamente instalado en su servidor. Sin embargo, deberá configurarlo para complementarse con el otro software que instaló, de modo que su servidor funcione correctamente con el contenido de su sitio.

Paso 5: Configuración de Nginx para usar el procesador PHP

En este punto, ya tendrá instalados todos los componentes requeridos de una pila LEMP. En el nivel de la configuración, el único cambio que aún debe hacer es indicarle a Nginx que utilice su procesador PHP para contenido dinámico.

Este cambio de configuración se realiza en el nivel de bloque del servidor (los bloques de servidor son similares a los hosts virtuales de Apache). Abra el archivo predeterminado de configuración de bloques del servidor Nginx escribiendo lo siguiente:

  • sudo vi /etc/opt/rh/rh-nginx112/nginx/nginx.conf

Elimine los comentarios del bloque de ubicación ~ \.php$ (el segmento del archivo que se ocupa de las solicitudes PHP, que se encuentra dentro del bloque del server) y su contenido borrando los símbolos de numeral (#) del principio de cada línea. También debe actualizar la opción fastcgi_param a SCRIPT FILENAME $document_root$fastcgi_script_name. Esto informa a PHP sobre la ubicación de la raíz del documento donde puede encontrar archivos para procesar.

Una vez realizados los cambios necesarios, el bloque del server tendrá este aspecto:

/etc/nginx/sites-available/default
...
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  _;
    root         /opt/rh/rh-nginx112/root/usr/share/nginx/html;

    # Load configuration files for the default server block.
    include      /etc/opt/rh/rh-nginx112/nginx/default.d/*.conf;

    location / {
    }

    error_page 404 /404.html;
    location = /40x.html {
    }

    error_page 500 502 503 504  /50x.html;
    location = /50x.html {
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
...

Cuando realice los cambios, podrá guardar el archivo y salir del editor.

A continuación, pruebe someta a prueba su archivo de configuración en busca de errores de sintaxis ejecutando los siguientes comandos:

  • source /opt/rh/rh-nginx112/enable
  • sudo nginx -t

Si se notifica algún error, vuelva a revisar su archivo antes de continuar.

Una vez que su archivo de configuración sea válido, vuelva a cargar Nginx para implementar los cambios que realizó:

  • sudo systemctl reload rh-nginx112-nginx

Ahora que Nginx, PHP y MariaDB se han instalado y configurado, solo queda confirmar que la configuración de pila LEMP pueda facilitar correctamente el contenido a los visitantes de su sitio.

Paso 6: Creación de un archivo PHP para probar la configuración

Su pila LEMP ahora está completamente configurada y puede probarla para validar que Nginx pueda proporcionar archivos .php a su procesador PHP correctamente. Esto se realiza creando un archivo PHP de prueba en la raíz de nuestro documento.

Abra un nuevo archivo llamado info.php dentro de la raíz del documento:

  • sudo vi /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

Añada al archivo la línea que se muestra a continuación. En ella se incluye código PHP válido que mostrará información sobre su servidor:

112/root/usr/share/nginx/html/info.php’>/opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php
<?php phpinfo(); ?>

Cuando termine, guarde y cierre el archivo. Luego, visite esta página en su navegador web usando el nombre de dominio o la dirección IP pública de su servidor seguidos de /info.php:

http://server_domain_or_IP/info.php

Verá una página web generada por PHP con información sobre su servidor:

Información de página de PHP

Si ve una página con este aspecto, significa que habrá configurado el procesamiento de PHP con Nginx de forma satisfactoria.

Tras verificar que Nginx represente la página de forma correcta, la mejor opción será eliminar el archivo que creó porque puede dar indicios sobre su configuración que podrían ser útiles para que usuarios no autorizados intenten ingresar. Siempre puede regenerar este archivo si lo necesita más adelante.

Elimine el archivo escribiendo lo siguiente:

  • sudo rm /opt/rh/rh-nginx112/root/usr/share/nginx/html/info.php

Con esto, confirmará que todos los componentes de la pila LEMP se instalaron y configuraron correctamente en su servidor.

Conclusión

Ahora contará con una pila LEMP totalmente segura en su servidor CentOS 7. Esto le proporcionará una base muy flexible para proporcionar contenido web a sus visitantes.

Las SCLs también se utilizan para instalar varias versiones de software y alternar entre ellas. Puede ver la lista de todas las colecciones instaladas en el sistema ejecutando lo siguiente:

  • scl --list

Si le interesa, podrá encontrar más información sobre Software Collections en el sitio oficial.

Creative Commons License