Tutorial

Cómo instalar la pila Linux, Nginx, MySQL, PHP (LEMP) en CentOS 8

Published on March 19, 2020
Español
Cómo instalar la pila Linux, Nginx, MySQL, PHP (LEMP) en CentOS 8

Introducción

La pila de software LEMP es un grupo de elementos de software que puede utilizarse para ofrecer páginas web y aplicaciones web dinámicas escritas en PHP. El nombre “LEMP” es un acrónimo que hace referencia a un sistema operativo Linux con un servidor web Nginx (se pronuncia “Engine-X”. Los datos de backend se almacenan en la base de datos MariaDB y el procesamiento dinámico se gestiona a través de PHP.

La capa de la base de datos de una pila LEMP es normalmente un servidor de base de datos MySQL, pero antes de la publicación de CentOS 8, MySQL no estaba disponible a través de los repositorios predeterminados de CentOS. Debido a esto, MariaDB, una ramificación de la comunidad de MySQL, se convirtió en una alternativa ampliamente aceptada a MySQL como sistema de base de datos predeterminada para pilas LEMP en máquinas con CentOS. MariaDB funciona como reemplazo del servidor MySQL original, lo que en la práctica significa que puede realizar el cambio a MariaDB sin necesidad de realizar configuraciones ni cambios en el código en su aplicación.

A través de esta guía, instalará una pila LEMP en un servidor de CentOS 8. Aunque MySQL está disponible en los repositorios predeterminados en CentOS 8, en esta guía se mostrará el proceso de configuración de una pila LEMP con MariaDB como sistema de administración de bases de datos.

Requisitos previos

Para seguir esta guía, necesitará acceso a un servidor CentOS 8 como usuario no root con privilegios sudo y un firewall activo instalado en su servidor. Para configurarlo, siga nuestra Guía de configuración inicial de servidores para CentOS 8.

Paso 1: Instalar el servidor web Nginx

Para mostrar páginas web a los visitantes de nuestro sitio, emplearemos Nginx, un servidor web de alto rendimiento. Usaremos el administrador de paquetes dnf, que es el nuevo administrador de paquetes predeterminado de CentOS 8, para instalar este software.

Instale el paquete nginx con:

  1. sudo dnf install nginx

Cuando se le solicite, introduzca y para confirmar que desea instalar nginx.

Cuando finalice la instalación, ejecute el siguiente comando para habilitar e iniciar el servidor:

  1. sudo systemctl start nginx

En caso de que haya habilitado el firewall firewalld conforme a nuestra guía inicial de configuración para servidores, deberá permitir las conexiones a Nginx. Con el siguiente comando se habilitarán de forma permanente las conexiones HTTP, que se ejecutan en el puerto 80 por defecto:

  1. sudo firewall-cmd --permanent --add-service=http

Para verificar que se aplicó el cambio, puede ejecutar lo siguiente:

  1. sudo firewall-cmd --permanent --list-all

Verá resultados como este:

Output
public target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client http ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:

Deberá volver a cargar la configuración del firewall para que los cambios surtan efecto:

  1. sudo firewall-cmd --reload

Una vez añadida la nueva regla de firewall, puede verificar si su servidor está activo accediendo a la dirección IP pública o al nombre del dominio de este desde su navegador web.

Nota: En caso de que utilice DigitalOcean como proveedor de hosting de DNS, puede consultar nuestros documentos sobre productos para hallar instrucciones detalladas sobre cómo configurar un nuevo nombre de dominio y apuntarlo a su servidor.

Si no tiene un nombre de dominio para su servidor y no conoce la dirección IP pública de este, puede encontrarla ejecutando el siguiente comando:

  1. ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

Con esto se mostrarán algunas direcciones IP. Puede probar cada una de estas en su navegador web.

Como alternativa, podrá verificar la dirección IP accesible, como se ve desde otras ubicaciones de Internet:

  1. curl -4 icanhazip.com

Escriba la dirección que reciba en su navegador web. Esta lo llevará a la página de destino predeterminada de Nginx:

Página predeterminada de Nginx, CentOS 8

Si ve esta página, su servidor web estará correctamente instalado.

Paso 2 - Instalar MariaDB

Ahora que dispone de un servidor web funcional, deberá instalar un sistema de base de datos para poder almacenar y gestionar los datos de su sitio. Instalaremos MariaDB, una ramificación del servidor MySQL original de Oracle desarrollada por la comunidad.

Para instalar este software, ejecute lo siguiente:

  1. sudo dnf install mariadb-server

Cuando termine la instalación, habilite e inicie el servidor MariaDB con lo siguiente:

  1. sudo systemctl start mariadb

Par mejorar la seguridad del servidor de su base de datos, se recomienda que ejecute una secuencia de comandos de seguridad que se incluye con MariaDB. Esta secuencia de comandos eliminará algunos ajustes predeterminados poco seguros y bloqueará el acceso a su sistema de base de datos. Inicie la secuencia de comandos interactiva ejecutando lo siguiente:

  1. sudo mysql_secure_installation

Con esta secuencia de comandos, verá una serie de solicitudes mediante las cuales podrá realizar cambios en las opciones de seguridad de su instalación de MariaDB. En la primera solicitud se pedirá que introduzca la contraseña root de la base de datos actual. Esto no debe confundirse con el usuario root de sistema. El usuario database root es un usuario administrativo con privilegios completos sobre el sistema de base de datos. Debido a que acaba de instalar MariaDB y aún no realizó aún cambios en la configuración, el espacio de esta contraseña estará en blanco. Por ello, pulse ENTER en la solicitud.

En la siguiente solicitud se pregunta si desea configurar una contraseña root de la base de datos. Debido a que MariaDB usa un método de autenticación especial para el usuario root que normalmente proporciona más seguridad que una contraseña, no es necesario que la configure ahora. Escriba N y pulse ENTER.

Desde allí, puede pulsar Y y luego ENTER para aceptar los valores predeterminados para todas las preguntas siguientes. 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 el servidor respete de inmediato los cambios que realizó.

Cuando termine, inicie sesión en la consola de MariaDB escribiendo lo siguiente:

  1. sudo mysql

Esto permitirá establecer conexión con el servidor de MariaDB como usuario root de la base de datos administrativa, lo que se infiere del uso de sudo cuando se ejecuta este comando. Debería ver el siguiente resultado:

Output
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.3.17-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

Observe que no era necesario que proporcionara una contraseña para establecer conexión como usuario root. Eso funciona porque el método de autenticación predeterminado para el usuario administrativo de MariaDB es unix_socket en vez de una password. Aunque esto pueda parecer un problema de seguridad al principio, hace que el servidor de la base de datos sea más seguro porque los únicos usuarios que pueden iniciar sesión como el usuario root de MariaDB son los usuarios del sistema con privilegios sudo que establecen conexión desde la consola o a través de una aplicación que se ejecute con los mismos privilegios. En términos prácticos, eso significa que no podrá usar el usuario root de la base de datos administrativa para establecer conexión desde su aplicación PHP.

Para mayor seguridad, es mejor contar con cuentas de usuario dedicadas con privilegios de menor alcance configurados para cada base de datos, en especial si planea disponer de varias bases de datos alojadas en su servidor. Para demostrar dicha configuración, crearemos una base de datos llamada example_database y un usuario llamado example_user, pero puede sustituir estos nombres por valores diferentes.

Para crear una nueva base de datos, ejecute el siguiente comando desde su consola de MariaDB:

  1. CREATE DATABASE example_database;

Ahora puede crear un nuevo usuario y concederle privilegios completos sobre la base de datos personalizada que acaba de crear. El siguiente comando define la contraseña de este usuario como password, pero debería sustituir este valor por una contraseña segura que elija:

  1. GRANT ALL ON example_database.* TO 'example_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Esto proporcionará al usuario example_user privilegios completos sobre la base de datos example\_database y, al mismo tiempo, evitará que este usuario cree o modifique otras bases de datos en su servidor.

Vacíe los privilegios para garantizar que se guarden y estén disponibles en la sesión actual:

  1. FLUSH PRIVILEGES;

Después de esto, cierre el shell de MariaDB:

  1. exit

Puede verificar si el nuevo usuario tiene los permisos adecuados iniciando sesión de nuevo en la consola de MariaDB, esta vez con las credenciales de usuario personalizadas.

  1. mysql -u example_user -p

Observe el indicador -p en este comando; le solicitará la contraseña que eligió cuando creó el usuario example_user. Después iniciar sesión en la consola de MariaDB, confirme que tenga acceso a la base de datos example\_database:

  1. SHOW DATABASES;

Esto generará el siguiente resultado:

Output
+--------------------+ | Database | +--------------------+ | example_database | | information_schema | +--------------------+ 2 rows in set (0.000 sec)

Para cerrar el shell de MariaDB, escriba lo siguiente:

  1. exit

En este punto, su sistema de base de datos estará configurado y podrá proceder a instalar PHP, el componente final de la pila LAMP.

Paso 3: Instalar PHP-FPM

Instaló Nginx para presentar su contenido y MariaDB para almacenar y administrar sus datos. Ahora puede instalar PHP a fin de procesar código y generar contenido dinámico para el servidor web.

Aunque Apache integra el intérprete PHP en cada solicitud, Nginx requiere un programa externo para gestionar el procesamiento de PHP y actuar como puente entre el intérprete PHP y el servidor web. Esto permite un mejor rendimiento general en la mayoría de los sitios web basados en PHP, pero requiere configuración adicional. Deberá instalar php-fpm, que significa “PHP fastCGI process manager”, e indicar a Nginx que pase solicitudes PHP a este software para su procesamiento. Adicionalmente, necesitará php-mysqlnd, un módulo PHP que permite a PHP comunicarse con bases de datos basadas en MySQL. Los paquetes PHP básicos se instalarán automáticamente como dependencias.

Para instalar los paquetes php-fpm y php-mysql, ejecute lo siguiente:

  1. sudo dnf install php-fpm php-mysqlnd

Cuando finalice la instalación, deberá editar el archivo /etc/php-fpm.d/www.conf para ajustar un par de ajustes.

El editor de texto predeterminado que viene con CentOS 8 es vi. vi es un editor de texto extremadamente potente, pero puede ser un tanto obtuso para los usuarios que carecen de experiencia con él. Posiblemente desee instalar un editor más sencillo, como nano, para facilitar la edición de los archivos de configuración en su servidor de CentOS 8.

  1. sudo dnf install nano

Ahora, abra el archivo de configuración /etc/php-fpm.d/www.conf usando nano o el editor que prefiera:

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

Busque las directivas user y group. Si usa nano, puede pulsar CTRL+W para buscar estos términos dentro del archivo abierto.

/etc/php-fpm.d/www.conf
…
; 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 = apache
; RPM: Keep a group allowed to write in log dir.
group = apache

Verá que el valor de las variables user y group es apache. Deberá cambiar el valor a nginx:

/etc/php-fpm.d/www.conf
…
; 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 y cierre el archivo cuando finalice la edición. Si usa nano, hágalo pulsando CTRL + X, Y y luego ENTER.

Para habilitar e iniciar el servicio php-fpm, ejecute lo siguiente:

  1. sudo systemctl start php-fpm

Finalmente, reinicie el servidor web Nginx de modo que cargue los archivos de configuración creados por la instalación de php-fmp:

  1. sudo systemctl restart nginx

Su servidor quedará, así, completamente configurado. En el siguiente paso, crearemos una secuencia de comandos de pruebas PHP para verificar que todo funcione como se espera.

Paso 4: Probar PHP con Nginx

En CentOS 8, la instalación predeterminada de php-fpm crea automáticamente archivos de configuración que ahora permitirán que su servidor web Nginx gestione los archivos .php en la raíz de documentos predeterminada ubicada en /usr/share/nginx/html. No tendrá necesidad de realizar cambios en la configuración de Nginx para que PHP funcione correctamente en su servidor web.

El único ajuste que realizaremos consiste en cambiar la configuración de permisos predeterminada en la carpeta raíz de documentos de Nginx. De esta forma, podrá crear y modificar archivos en ese directorio con su usuario de sistema regular, sin necesidad de añadir a cada comando el prefijo sudo.

Con el siguiente comando se cambiará la propiedad de la raíz del documento predeterminado de Nginx a un usuario y grupo llamado sammy. Por lo tanto, asegúrese de resaltar el nombre de usuario y el grupo en este comando de modo que refleje el nombre de usuario y grupo de su sistema.

  1. sudo chown -R sammy.sammy /usr/share/nginx/html/

Ahora, crearemos una página PHP de prueba para garantizar que el servidor web funcione como se espera.

Cree un nuevo archivo PHP llamado info.php en el directorio /usr/share/nginx/html:

  1. nano /usr/share/nginx/html/info.php

El siguiente código PHP mostrará información sobre el entorno PHP actual activo en el servidor:

/usr/share/nginx/html/info.php
<?php

phpinfo();

Cuando termine, guarde y cierre el archivo.

Ahora, podemos verificar si nuestro servidor web puede mostrar correctamente el contenido generado por una secuencia de comandos comandos Vaya a su navegador y acceda al nombre de host o la dirección IP de su servidor; agregue /info.php al final:

http://server_host_or_IP/info.php

Verá una página similar a la siguiente:

Información de PHP predeterminada de CentOS 8

Tras comprobar la información pertinente sobre su servidor PHP a través de esa página, será mejor que elimine el archivo que creó porque contiene información confidencial sobre su entorno PHP y su servidor CentOS. Puede usar rm para eliminar ese archivo:

  1. rm /usr/share/nginx/html/info.php

Siempre puede regenerar este archivo si lo necesita más adelante. A continuación, probaremos la conexión con la base de datos del lado PHP.

Paso 5: Probar la conexión con la base de datos desde PHP (opcional)

Si desea probar si PHP puede establecer conexión con MariaDB y ejecutar consultas a la base de datos, puede crear una tabla de prueba con datos ficticios y realizar consultas relacionadas con su contenido desde una secuencia de comandos PHP.

Primero, establezca conexión con la consola MariaDB usando el usuario de la base de datos que creó en el paso 2 de esta guía:

  1. mysql -u example_user -p

Cree una tabla llamada todo_list. Desde la consola de MariaDB, ejecute la siguiente instrucción:

CREATE TABLE example_database.todo_list (
	item_id INT AUTO_INCREMENT,
	content VARCHAR(255),
	PRIMARY KEY(item_id)
);

Ahora, inserte algunas filas de contenido en la tabla de muestra. Es posible que quiera repetir el siguiente comando algunas veces, usando valores diferentes:

  1. INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

Para confirmar que los datos se guardaron correctamente en su tabla, ejecute lo siguiente:

  1. SELECT * FROM example_database.todo_list;

Verá lo siguiente:

Output
+---------+--------------------------+ | item_id | content | +---------+--------------------------+ | 1 | My first important item | | 2 | My second important item | | 3 | My third important item | | 4 | and this one more thing | +---------+--------------------------+ 4 rows in set (0.000 sec)

Después de confirmar que haya datos válidos en su tabla de prueba, intente cerrar la consola de MariaDB:

  1. exit

Ahora podrá crear una secuencia de comandos PHO que se conectará a MariaDB y realizará consultas relacionadas con su contenido. Cree un nuevo archivo PHP en su directorio web root personalizado usando su editor preferido. En este caso, usaremos nano:

  1. nano /usr/share/nginx/html/todo_list.php

Añada el siguiente contenido a su secuencia de comandos PHP:

/usr/share/nginx/html/todo_list.php
<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>";
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Guarde y cierre el archivo cuando finalice la edición.

Ahora puede acceder a esta página en su navegador web visitando el nombre de host o la dirección IP pública de su servidor. Agregue /todo_list.php después:

http://server_host_or_IP/todo_list.php

Debería ver una página como esta, en la que se muestra el contenido que insertó en su tabla de prueba:

Ejemplo de la lista “todo” PHP

Eso significa que su entorno PHP está listo para establecer conexión e interactuar con su servidor de MariaDB.

Conclusión

A lo largo de esta guía, creó una base flexible para presentar sitios web y aplicaciones PHP a sus visitantes usando Nginx como servidor web. Configuró Nginx para que administre solicitudes PHP a través de php-fpm y también configuró una base de datos de MariaDB para almacenar los datos de su sitio web.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar

Developer Advocate

Dev/Ops passionate about open source, PHP, and Linux.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
1 Comments


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

wooow que bueno el tutorial!!! me re sirvió!! tenes alguno de como instalar cpanel en centos 8? copate y armalo que viene ideal para la cuarentena. Gracias por compartirlo!!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel