Les comparto la actualización del artículo Cómo instalar en Ubuntu Linux Nginx, MySQL, PHP (LEMP), ya que ha sufrido algunos cambios respecto a PHP y en las versiones nuevas de Ubuntu algunos lectores he han reportado que no pueden ejecutarlo por cambios en los nuevas versiones de Ubuntu.
Introducción
La pila de software LEMP es un grupo de software que se puede utilizar para servir páginas web dinámicas y aplicaciones web escritas en PHP.
Este es un acrónimo que describe un sistema operativo L inux, con un servidor web Nginx (pronunciado como “ E ngine-X”). Los datos de back-end se almacenan en la base de datos MySQL y PHP se encarga del procesamiento dinámico .
Este articulo muestra cómo instalar una pila LEMP en un servidor Ubuntu 22.04. El sistema operativo Ubuntu se ocupa de la parte de Linux de la pila. Describiré cómo poner en funcionamiento el resto de los componentes.
Requisitos previos
Para completar este tutorial, necesitará acceso a un servidor Ubuntu 22.04 como usuario normal, no root sudo
, y un firewall habilitado en su servidor. Para configurar esto debe instalar la versión Ubuntu Server 22.04.
También es aplicable a la última versión 22.10 de Ubuntu.
Instalación del servidor web Nginx
Para mostrar páginas web a los visitantes del sitio, utilizará Nginx, un servidor web de alto rendimiento. Utilizará el administrador de paquetes APT para obtener este software.
Dado que es la primera vez que se usa apt
en una sesión, comience actualizando el índice de paquetes de su servidor:
sudo apt update
A continuación, ejecute apt install
para instalar Nginx:
sudo apt install nginx
Cuando se le solicite, presione Y
y ENTER
para confirmar que desea instalar Nginx. Una vez finalizada la instalación, el servidor web Nginx estará activo y ejecutándose en su servidor Ubuntu 22.04.
Si instaló el servidor con el idioma españos, pues responda con S. Yo aconsejo instalar los servidores en idioma nativo, agregarle los los diccionarios de español luego.
Esto pues, sirve para buscar rápidamente los errores o compartirlos en los grupos de discusión como listas o foros con el mensaje exacto.
Si tiene el firewall ufw
habilitado, como se recomienda, deberá permitir las conexiones a Nginx.
Nginx registra algunos perfiles de aplicación UFW diferentes durante la instalación. Para verificar qué perfiles UFW están disponibles, ejecute:
sudo ufw app list
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
Se recomienda que habilite el perfil más restrictivo que aún permitirá el tráfico que necesita. Dado que no ha configurado SSL para su servidor en esta guía, solo necesitará permitir el tráfico HTTP normal en el puerto 80
.
Habilite esto ejecutando lo siguiente:
sudo ufw allow 'Nginx HTTP'
Puede verificar el cambio comprobando el estado:
sudo ufw status
Esta salida muestra que ahora se permite el tráfico HTTP:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Con la nueva regla de firewall agregada, puede probar si el servidor está en funcionamiento accediendo al nombre de dominio o la dirección IP pública de su servidor en su navegador web.
Si no tiene un nombre de dominio apuntado a su servidor y no conoce la dirección IP pública de su servidor, puede encontrarlo ejecutando cualquiera de los siguientes comandos:
ip addr show
hostname -I
Esto imprimirá algunas direcciones IP. Puede probar cada uno de ellos en su navegador web.
Como alternativa, puede verificar qué dirección IP es accesible, tal como se ve desde otras ubicaciones en Internet:
curl -4 dagorret.com.ar
Escriba la dirección que recibe en su navegador web y lo llevará a la página de destino predeterminada de Nginx:
http://server_domain_or_IP
Si recibe esta página, significa que instaló correctamente Nginx y habilitó el tráfico HTTP para su servidor web.
Nota: Sino no tiene ufw habilitado, antes de ejecutar las reglas habilite ufw. Es tan simple como ejecturar
sudo ufw enable
Instalar MySQL
Ahora que tiene un servidor web en funcionamiento, necesita instalar el sistema de base de datos para almacenar y administrar los datos de su sitio. MySQL es un popular sistema de gestión de bases de datos utilizado en entornos PHP.
Nuevamente, use apt
para adquirir e instalar este software:
sudo apt install mysql-server
Cuando se le solicite, confirme la instalación presionando Y
y luego ENTER
.
Cuando finalice la instalación, se recomienda que ejecute un script de seguridad que viene preinstalado con MySQL.
Este script eliminará algunas configuraciones predeterminadas inseguras y bloqueará el acceso a su sistema de base de datos. Inicie el script interactivo ejecutando el siguiente comando:
sudo mysql_secure_installation
Se le preguntará si desea configurar el VALIDATE PASSWORD PLUGIN
.
Nota: Habilitar esta función es algo así como una cuestión de criterio. Si está habilitado, MySQL rechazará las contraseñas que no coincidan con los criterios especificados con un error. Es seguro dejar la validación deshabilitada, pero siempre debe usar contraseñas seguras y únicas para las credenciales de la base de datos.
Responda Y
sí, o cualquier otra cosa para continuar sin habilitar:
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:
Si responde “sí”, se le pedirá que seleccione un nivel de validación de contraseña. Tenga en cuenta que si ingresa 2
para el nivel más fuerte, recibirá errores al intentar establecer cualquier contraseña que no contenga números, letras mayúsculas y minúsculas y caracteres especiales:
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
Independientemente de si eligió configurar el VALIDATE PASSWORD PLUGIN
, su servidor le pedirá que seleccione y confirme una contraseña para el usuario root de MySQL.
Esto no debe confundirse con la raíz del sistema . El usuario raíz de la base de datos es un usuario administrativo con privilegios completos sobre el sistema de la base de datos. Aunque el método de autenticación predeterminado para el usuario root de MySQL prescinde del uso de una contraseña, incluso cuando se establece una , debe definir una contraseña segura aquí como medida de seguridad adicional. Hablare de esto en un momento.
Si habilitó la validación de contraseña, se le mostrará la seguridad de la contraseña raíz que ingresó y su servidor le preguntará si desea continuar con esa contraseña. Si está satisfecho con su contraseña actual, presione Y
“sí” en el mensaje:
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
Para el resto de las preguntas, presione Y
y presione la ENTER
en cada indicación.
Esto eliminará algunos usuarios anónimos y la base de datos de prueba, deshabilitará los inicios de sesión raíz remotos y cargará estas nuevas reglas para que MySQL respete inmediatamente los cambios que ha realizado.
Cuando haya terminado, pruebe si puede iniciar sesión en la consola de MySQL:
sudo mysql
Esto se conectará al servidor MySQL como el usuario root de la base de datos administrativa , que se deduce del uso de sudo
c uando se ejecuta este comando. Debería recibir el siguiente resultado:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Para salir de la consola de MySQL, escriba lo siguiente:
exit
Tenga en cuenta que no necesitaba proporcionar una contraseña para conectarse como usuario raíz , aunque haya definido una al ejecutar el mysql_secure_installation
script.
Esto se debe a que, cuando se instala en Ubuntu, el método de autenticación predeterminado para el usuario administrativo de MySQL es auth_socket
, en lugar de un método que usa una contraseña.
Esto puede parecer un problema de seguridad al principio, pero hace que el servidor de la base de datos sea más seguro, ya que los únicos usuarios que pueden iniciar sesión como usuario raíz de MySQL son los usuarios del sistema con privilegios sudo
que se conectan desde la consola o a través de una aplicación que se ejecuta con los mismos privilegios.
En términos prácticos, eso significa que no podrá usar el usuario raíz de la base de datos administrativa para conectarse desde su aplicación PHP.
Para una mayor seguridad, es mejor tener cuentas de usuario dedicadas con privilegios menos expansivos configurados para cada base de datos, especialmente si planea tener varias bases de datos alojadas en su servidor.
Nota: Ciertas versiones anteriores de la biblioteca PHP nativa de MySQL mysqlnd
no admiten caching_sha2_authentication
, el método de autenticación predeterminado para usuarios creados en MySQL 8. Por ese motivo, al crear usuarios de base de datos para aplicaciones PHP en MySQL 8, es posible que deba asegurarse de que estén configurado para usar en su mysql_native_password
en su lugar.
Su servidor MySQL ya está instalado y protegido. A continuación, instalará PHP, el componente final de la pila LEMP.
instalación de PHP
Tiene Nginx instalado para servir su contenido y MySQL instalado para almacenar y administrar sus datos. Ahora puede instalar PHP para procesar código y generar contenido dinámico para el servidor web.
Mientras que Apache incorpora el intérprete de PHP en cada solicitud, Nginx requiere un programa externo para manejar el procesamiento de PHP y actuar como un puente entre el intérprete de PHP y el servidor web.
Esto permite un mejor rendimiento general en la mayoría de los sitios web basados en PHP, pero requiere una configuración adicional. Deberá instalar php8.1-fpm
, que significa “administrador de procesos PHP fastCGI” y usa la versión actual de PHP, para decirle a Nginx que pase las solicitudes de PHP a este software para su procesamiento. Además, necesitará php-mysql
un módulo PHP que permita que PHP se comunique con bases de datos basadas en MySQL. Los paquetes principales de PHP se instalarán automáticamente como dependencias.
Para instalar los paquetes php8.1-fpm
y , ejecute:php-mysql
sudo apt install php8.1-fpm php-mysql
Cuando se le solicite, presione Y
y ENTER
para confirmar la instalación.
Ahora tiene sus componentes PHP instalados. A continuación, configurará Nginx para usarlos.
Configurar Nginx para usar el procesador PHP
Cuando usamos el servidor web Nginx, podemos crear bloques de servidor (similares a los hosts virtuales en Apache) para encapsular los detalles de configuración y alojar más de un dominio en un solo servidor. En esta guía, usaremos su_dominio como nombre de dominio de ejemplo.
En Ubuntu 22.04, Nginx tiene un bloque de servidor habilitado de forma predeterminada y está configurado para entregar documentos desde un directorio en /var/www/html
.
Si bien esto funciona bien para un solo sitio, puede volverse difícil de administrar si aloja varios sitios. En lugar de modificar /var/www/html
, crearemos una estructura de directorio dentro /var/www
para su sitio web su_dominio.
Dejaremos /var/www/html
como el directorio predeterminado que se atenderá si la solicitud de un cliente no coincide con ningún otro sitio.
Cree el directorio web raíz para su_dominio de la siguiente manera:
sudo mkdir /var/www/su_dominio
A continuación, asigne la propiedad del directorio con la variable de entorno $USER
, que hará referencia a su usuario actual del sistema:
sudo chown -R $USER:$USER /var/www/su_dominio
Luego, abra un nuevo archivo de configuración en el directorio sites-available
de Nginx usando su editor de línea de comandos preferido. Aquí, usaremos nano
:
sudo nano /etc/nginx/sites-available/su_dominio
Esto creará un nuevo archivo en blanco. Inserte la siguiente configuración básica: /etc/nginx/sitios-disponibles/su_dominio
server {
listen 80;
server_name su_dominio www.su_dominio;
root /var/www/su_dominio;
index index.html index.htm index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Esto es lo que hace cada una de estas directivas y bloques de ubicación:
listen
— Define en qué puerto escuchará Nginx. En este caso, escuchará en el puerto80
, el puerto predeterminado para HTTP.root
— Define la raíz del documento donde se almacenan los archivos servidos por este sitio web.index
— Define en qué orden Nginx priorizará los archivos de índice para este sitio web. Es una práctica común enumerarindex.html
con mayor prioridad queindex.php
l para permitir la configuración rápida de una página de inicio de mantenimiento en las aplicaciones PHP. Puede ajustar esta configuración para que se adapte mejor a las necesidades de su aplicación.server_name
— Define qué nombres de dominio y/o direcciones IP debe responder este bloque de servidor. Apunte esta directiva al nombre de dominio de su servidor o dirección IP pública.location /
— El primer bloque de ubicación incluye unatry_files
directiva que verifica la existencia de archivos o directorios que coincidan con una solicitud de URL. Si Nginx no puede encontrar el recurso adecuado, devolverá un error 404.location ~ \.php$
— Este bloque de ubicación maneja el procesamiento de PHP real al señalar a Nginx en el archivo de configuraciónfastcgi-php.conf
y el archivophp8.1-fpm.sock
, que declara con qué socket está asociadophp8.1-fpm
.location ~ /\.ht
— El último bloque de ubicación se ocupa de los archivos.htaccess
, que en Nginx no procesa. Al agregar la directivadeny all
, si algún archivo.htaccess
a la raíz del documento, no se entregará a los visitantes.
Cuando haya terminado de editar, guarde y cierre el archivo. Si está usando nano
, puede hacerlo presionando CTRL+X
y luego Y
y ENTER
para confirmar.
Active su configuración vinculando el archivo de configuración desde el directorio sites-enabled
de Nginx:
sudo ln -s /etc/nginx/sites-available/su_dominio /etc/nginx/sites-enabled/
Luego, desvincule el archivo de configuración predeterminado del directorio/sites-enabled/
directorio:
sudo unlink /etc/nginx/sites-enabled/default
Nota : si alguna vez necesita restaurar la configuración predeterminada, puede hacerlo recreando el enlace simbólico, como el siguiente:
sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/
Esto le indicará a Nginx que use la configuración la próxima vez que se vuelva a cargar. Puede probar su configuración en busca de errores de sintaxis ejecutando lo siguiente:
sudo nginx -t
Si se informa algún error, vuelva a su archivo de configuración para revisar su contenido antes de continuar.
Cuando esté listo, vuelva a cargar Nginx para aplicar los cambios:
sudo systemctl reload nginx
Su nuevo sitio web ahora está activo, pero la raíz web aún está vacía. Cree un archivo en esa ubicación para que pueda probar que su nuevo bloque de servidor funciona como se esperaba:/var/www/su_dominio/index.html
nano /var/www/su_dominio/index.html
Incluya el siguiente contenido en este archivo: /var/www/su_dominio/index.html
<html>
<head>
<title>su_dominio Sitio Web</title>
</head>
<body>
<h1>Hola Mundo!</h1>
<p>Esta es una página de aterrizaje para <strong>su_dominio</strong>.</p>
</body>
</html>
Ahora vaya a su navegador y acceda al nombre de dominio o dirección IP de su servidor, como se indica en la directiva server_name
en el archivo de configuración de bloqueo de su servidor:
http://server_domain_or_IP
Recibirá una página que escribió arriba:
Si recibe esta página, significa que su bloque de servidor Nginx funciona como se esperaba.
Puede dejar este archivo como una página de destino temporal para su aplicación hasta que configure un archivo index.php
para reemplazarlo. Una vez que haga eso, recuerde eliminar o cambiar el nombre del index.html
desde la raíz de su documento, ya que tendría prioridad sobre un archivo index.php
de forma predeterminada.
Su pila LEMP ahora está completamente configurada.
Prueba de PHP con Nginx
Su pila LEMP ahora debería estar completamente configurada. Puede probarlo para validar que Nginx puede transferir correctamente archivos.php
archivos a su procesador PHP.
Puede hacer esto creando un archivo PHP de prueba en la raíz de su documento. Abra un nuevo archivo llamado info.php
dentro de la raíz de su documento en su editor de texto preferido:
nano /var/www/su_dominio/info.php
Agregue las siguientes líneas en el nuevo archivo. Este es un código PHP válido que devolverá información sobre su servidor: /var/www/su_dominio/info.php
<?php
phpinfo();
Cuando haya terminado, guarde y cierre el archivo.
Ahora puede acceder a esta página en su navegador web visitando el nombre de dominio o la dirección IP pública que configuró en su archivo de configuración de Nginx, seguido de /info.php
:
http://server_domain_or_IP/info.php
Recibirá una página web con información detallada sobre su servidor:
Después de verificar la información relevante sobre su servidor PHP a través de esa página, es mejor eliminar el archivo que creó, ya que contiene información confidencial sobre su entorno PHP y su servidor Ubuntu. Puede usar rm
para eliminar ese archivo:
sudo rm /var/www/su_dominio/info.php
Conclusión
En esta guía, construyó una base flexible para ofrecer sitios web y aplicaciones PHP a sus visitantes, utilizando Nginx como servidor web y MySQL como sistema de base de datos.