Tutorial

Cómo instalar Linux, Nginx, MySQL, PHP (pila LEMP) en Ubuntu 18.04

NginxMySQLPHPLEMPUbuntu 18.04Databases

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. El acrónimo describe un sistema operativo Linux, con un servidor web Nginx (que se pronuncia ​como “Engine-X”). Los datos backend se almacenan en la base de datos de MySQL y el procesamiento dinámico se gestiona a través de PHP.

En guía se muestra la forma de instalar una pila LEMP en un servidor de Ubuntu 18.04. El sistema operativo Ubuntu se ocupa de los primeros requisitos. Describiremos la manera de hacer funcionar el resto de los componentes.

Requisitos previos

Antes de completar este tutorial, deberá tener una cuenta de usuario no root en su servidor con privilegios sudo. Configure esta cuenta completando nuestra guía de configuración inicial para servidores de Ubuntu 18.04.

Una vez que tenga su usuario disponible, estará listo para comenzar con los pasos descritos en esta guía.

Paso 2: Instalar el servidor web Nginx

Para mostrar páginas web a los visitantes de nuestro sitio, emplearemos Nginx, un servidor web moderno y eficaz.

Todos los programas de software utilizados en este procedimiento provendrán de los repositorios de paquetes predeterminados de Ubuntu. Esto significa que podemos utilizar el conjunto de programas de administración de paquetes apt para completar las instalaciones necesarias.

Ya que esta es la primera vez que usamos apt para esta sesión, comience actualizando el índice de paquetes de su servidor. A continuación, instale el servidor:

  • sudo apt update
  • sudo apt install nginx

En Ubuntu 18.04, Nginx se configura para que ejecutarse después de la instalación.

Si tiene activo el firewall ufw, como se indica en la guía de configuración inicial, deberá permitir las conexiones a Nginx. Nginx se registra de forma automática con ufw tras la instalación, de modo que el procedimiento es bastante sencillo.

Se recomienda que habilite el perfil más restrictivo que aún permitirá el tráfico que usted desea. Debido a que no configuró SSL para su servidor a través de esta guía, solo deberá permitir el tráfico en el puerto 80.

Puede habilitarlo escribiendo lo siguiente:

  • sudo ufw allow 'Nginx HTTP'

Puede verificar el cambio ejecutando lo siguiente:

  • sudo ufw status

El resultado de este comando mostrará que el tráfico de HTTP está permitido:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)

Una vez agregada la nueva regla del firewall, 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 ejecutando siguiente comando:

  • 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:

  • 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:

http://server_domain_or_IP

Página predeterminada de Nginx

Si ve la página de arriba, significa que instaló Nginx de forma correcta.

Paso 2: Instalar MySQL para administrar datos de sitios

Ahora que dispone de un servidor web, debe instalar MySQL (sistema de administración de bases de datos) para almacenar y administrar los datos de su sitio.

Instale MySQL escribiendo lo siguiente:

  • sudo apt install mysql-server

El software de base de datos MySQL quedará instalado, pero su configuración aún no estará completa.

Para proteger la instalación, MySQL viene con un script que preguntará si deseamos modificar algunos valores predeterminados no seguros. Inicie el script escribiendo lo siguiente:

  • sudo mysql_secure_installation

Este script le preguntará si desea configurar el VALIDATE PASSWORD PLUGIN.

Advertencia: La habilitación de esta función queda a discreción del usuario. Si se habilita, MySQL rechazará con un mensaje de error las contraseñas que no coincidan con los criterios especificados. Esto provocará problemas si utiliza una contraseña débil junto con software que configure automáticamente las credenciales de usuario de MySQL, como los paquetes de Ubuntu para phpMyAdmin. Dejar la validación desactivada será una opción segura, pero siempre deberá utilizar contraseñas seguras y únicas para credenciales de bases de datos.

Elija Y para indicar que sí, o cualquier otra cosa para continuar sin la habilitación.

VALIDATE PASSWORD PLUGIN 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 plugin?

Press y|Y for Yes, any other key for No:

Si habilitó la validación, el script también le solicitará seleccionar un nivel de validación de contraseña. Tenga en cuenta que si ingresa 2, para marcar el nivel más seguro, recibirá mensajes de error al intentar configurar cualquier contraseña que no contenga números, letras en mayúscula y minúscula, y caracteres especiales, o que se base en palabras comunes del diccionario.

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: 1

A continuación, se le solicitará enviar y confirmar una contraseña root:

Please set the password for root here.

New password:

Re-enter new password:

Para el resto de las preguntas, debe elegir Y y presionar la tecla ENTER en cada mensaje. 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 MySQL respete de inmediato los cambios que realizamos.

Tenga en cuenta que en los sistemas Ubuntu con MySQL 5.7 (y versiones posteriores), el usuario root de MySQL se configura para la autenticación utilizando el complemento auth_socket de manera predeterminada en lugar de una contraseña. Esto en muchos casos proporciona mayor seguridad y utilidad, pero también puede generar complicaciones cuando deba permitir que un programa externo (como phpMyAdmin) acceda al usuario.

Si utiliza el complemento auth_socket para acceder a los ajustes de MySQL con su flujo de trabajo, puede continuar con el paso 3. Sin embargo, si prefiere utilizar una contraseña al conectarse con MySQL como root, deberá cambiar su método de autenticación de auth_socket a mysql_native_password. Para hacer esto, abra la línea de comandos de MySQL desde su terminal:

  • sudo mysql

A continuación, compruebe con el siguiente comando el método de autenticación utilizado por una de sus cuentas de usuario de MySQL:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | | auth_socket | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

En este ejemplo, puede ver que, en efecto, el usuario root se autentica utilizando el complemento de auth_socket. Para configurar la cuenta de root de modo que la autenticación se realice con una contraseña, ejecute el siguiente comando ALTER USER. Asegúrese de cambiar password por una contraseña segura que elija:

  • ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

A continuación, ejecute FLUSH PRIVILEGES para indicar al servidor que vuelva a cargar la tabla de permisos y aplique sus nuevos cambios:

  • FLUSH PRIVILEGES;

Compruebe de nuevo los métodos de autenticación empleados por cada uno de sus usuarios para confirmar que *root *deje de realizarla con el complemento de auth_socket:

  • SELECT user,authentication_string,plugin,host FROM mysql.user;
Output
+------------------+-------------------------------------------+-----------------------+-----------+ | user | authentication_string | plugin | host | +------------------+-------------------------------------------+-----------------------+-----------+ | root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost | | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | mysql_native_password | localhost | | debian-sys-maint | *CC744277A401A7D25BE1CA89AFF17BF607F876FF | mysql_native_password | localhost | +------------------+-------------------------------------------+-----------------------+-----------+ 4 rows in set (0.00 sec)

Puede ver en este resultado de ejemplo que el usuario *root *de MySQL ahora se autentica utilizando una contraseña. Una vez que confirme esto en su propio servidor, podrá cerrar el shell de MySQL:

  • exit

Nota: Después de configurar su usuario root de MySQL para la autenticación con una contraseña, ya no podrá acceder a MySQL con el comando sudo msql utilizado anteriormente. En su lugar, deberá ejecutar lo siguiente:

  • mysql -u root -p

Una vez que ingrese la contraseña que acaba de configurar, verá el la línea de comandos de MySQL.

En este punto, su sistema de bases de datos estará configurado y podrá instalar PHP.

Paso 3: Instalar PHP y configurar Nginx para utilizar el procesador de PHP

Ya tiene instalados Nginx para sus páginas y MySQL para el almacenamiento y la administración de sus datos. Sin embargo, aún le falta una herramienta que pueda generar contenido dinámico. Aquí es donde se considera PHP .

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

Nota: Según su proveedor de plataforma de nube, es posible que deba agregar el repositorio universe de Ubuntu, en el cual se incluye software gratuito y de código abierto actualizado por la comunidad de Ubuntu, antes de instalar el paquete php-fpm. Puede hacerlo escribiendo lo siguiente:

  • sudo add-apt-repository universe

Instale el módulo php-fpm junto con un paquete auxiliar adicional, php-mysql, que permitirá a PHP comunicarse con el backend de su base de datos. La instalación extraerá los archivos principales de PHP necesarios. Podrá ejecutarla escribiendo lo siguiente:

  • sudo apt install php-fpm php-mysql

Con esto, habrá instalado todos los componentes requeridos de la pila LEMP, pero aún deberá realizar algunos cambios en la configuración para indicar a Nginx que utilice el procesador PHP para contenido dinámico.

Esto se realiza en el nivel de bloque del servidor (los bloques de servidor son similares a los hosts virtuales de Apache). Para hacerlo, abra un nuevo archivo de configuración de bloques de servidor dentro del directorio /etc/nginx/sites-available/. En este ejemplo, el nuevo archivo de configuración de bloques de servidor se llama example.com, pero puede dar al suyo el nombre que desee:

  • sudo nano /etc/nginx/sites-available/example.com

Con la edición de un nuevo archivo de configuración de bloques de servidor, en lugar de editar el predeterminado podrá restaurar fácilmente la configuración predeterminada si lo necesita.

Agregue el siguiente contenido, tomado y modificado ligeramente a partir del archivo de configuración predeterminado de bloques de servidor, a su nuevo archivo de configuración de bloques de servidor:

/etc/nginx/sites-available/example.com
server {
        listen 80;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

        location / {
                try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }
}

Esto es lo que hacen estas directivas y estos bloques de ubicación:

  • listen: define en qué puerto Nginx escuchará. En este caso, escuchará en el puerto 80, el puerto predeterminado para HTTP.
  • root: define el root de documentos en el que se almacenan los archivos disponibles en el sitio web.
  • index: configura Nginx para dar prioridad a los archivos denominados index.php cuando se solicite un archivo de índice, si están disponibles.
  • server_name: define el bloque de servidor que debe utilizarse para una solicitud determinada enviada a su servidor. Introduzca esta directiva en el nombre de dominio o la dirección IP pública de su servidor.
  • location /: el primer bloque de ubicación incluye una directiva try_files, la cual comprueba la existencia de archivos que coincidan con una solicitud de URI. Si Nginx no puede encontrar el archivo apropiado, se mostrará un error 404.
  • location ~ \.php$: este bloque de ubicación administra el procesamiento de PHP real orientando Nginx al archivo de configuración fastcgi-php.conf y al archivo php7.2-fpm.sock, que declara el socket que se asocia con php-fpm.
  • location ~ /\.ht: el último bloque de ubicación maneja archivos .htaccess, que Nginx no procesa. Al agregar la directiva deny all, si algunos de los archivos .htaccess ingresa de alguna forma en el root de documentos, estos no se pondrán a disposición de los visitantes.

Una vez que agregue este contenido, guarde y cierre el archivo. Habilite su nuevo bloque de servidor creando un enlace simbólico entre su nuevo archivo de configuración de bloques de servidor (en el directorio /etc/nginx/sites-available/) y el directorio /etc/nginx/sites-enabled/:

  • sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Luego, desvincule el archivo de configuración predeterminado del directorio /sites-enabled/:

  • sudo unlink /etc/nginx/sites-enabled/default

Nota: Si necesita restablecer la configuración predeterminada, puede hacerlo recreando el ajuste del enlace simbólico como se muestra a continuación.

  • sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

Verifique si hay errores de sintaxis en su nuevo archivo de configuración escribiendo lo siguiente:

  • sudo nginx -t

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

Cuando esté listo, vuelva a cargar Nginx para realizar los cambios necesarios:

  • sudo systemctl reload nginx

Con esto concluye la instalación y configuración de su pila LEMP. Sin embargo, se recomienda confirmar que todos los componentes puedan comunicarse entre sí.

Paso 4: Crear un archivo PHP para probar la configuración

Su pila LEMP ahora debería estar configurada por completo. Puede probarla para validar la ejecución correcta de archivos .php a partir del procesador PHP por parte de Nginx.

Para hacerlo, utilice su editor de texto para crear un archivo PHP de prueba llamado info.php en su root de documentos:

  • sudo nano /var/www/html/info.php

Introduzca las líneas que se muestran a continuación en el archivo nuevo. Se incluye código PHP válido que mostrará información sobre su servidor:

/var/www/html/info.php
<?php
phpinfo();

Cuando termine, guarde y cierre el archivo.

Luego, visite esta página en su navegador web accediendo al nombre de dominio o a la dirección IP pública de su servidor con /info.php al final:

http://your_server_domain_or_IP/info.php

Debería 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.

Por ahora, elimine el archivo escribiendo lo siguiente:

  • sudo rm /var/www/html/info.php

Con esto, dispondrá de una pila LEMP completamente segura y funcional en su servidor de Ubuntu 18.04.

Conclusión

Una pila LEMP es una plataforma poderosa que le permitirá configurar y presentar casi cualquier sitio web o aplicación de su servidor.

Existen varios pasos posteriores que podría seguir a partir de este punto. Por ejemplo, debe asegurarse de que las conexiones con su servidor estén protegidas. Para ello, podría proteger su instalación de Nginx con Let’s Encrypt. Siguiendo esta guía, obtendrá un certificado TLS/SSL gratuito para su servidor, lo que permitirá ofrecer contenido mediante HTTPS.

Creative Commons License