Búsqueda de sitios web

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


Introducción

La pila de software LEMP sirve páginas web dinámicas y aplicaciones web escritas en PHP. Este es un acrónimo que describe un sistema operativo Linux, con un servidor web Nginx (pronunciado como «Engine-X»). Los datos del backend se almacenan en la base de datos MySQL y el procesamiento dinámico lo maneja PHP.

Esta guía demuestra cómo instalar un stack LEMP en un servidor Ubuntu. El sistema operativo Ubuntu se encarga de la parte de Linux del stack. Describiremos cómo poner en funcionamiento el resto de los componentes.

Nota: Este tutorial está dirigido principalmente a Ubuntu 22.04 LTS con PHP 8.1. Para los usuarios de Ubuntu 24.04 LTS, ajusten las referencias de la versión de PHP de php8.1-fpm a php8.3-fpm en todos los comandos. Además, asegúrese de actualizar cualquier ruta del socket de PHP-FPM en su configuración de Nginx (por ejemplo, use /run/php/php8.3-fpm.sock para Ubuntu 24.04).

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

  1. Instalando el servidor web Nginx
  2. Instalando MySQL
  3. Instalando PHP
  4. Configurando Nginx para usar el procesador PHP
  5. Probando PHP con Nginx
  6. Probando la conexión a la base de datos desde PHP

Requisitos previos

Usa un usuario sudo que no sea root en Ubuntu con el firewall UFW activado. Sigue nuestra guía de configuración inicial del servidor para Ubuntu para configurarlo.

Paso 1: Instalación del servidor web Nginx

Para mostrar páginas web a los visitantes del sitio, vas a utilizar Nginx, un servidor web de alto rendimiento. Usarás el gestor de paquetes APT para obtener este software.

Actualiza el índice de paquetes de tu servidor y luego instala Nginx:

sudo apt update

A continuación, ejecuta 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 funcionando en su servidor Ubuntu.

Verifica que Nginx esté en funcionamiento:

sudo systemctl status nginx

Deberías ver una salida que indique que Nginx está activo:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since...

En Ubuntu, Nginx está configurado para empezar a ejecutarse al instalarse.

Permitir el tráfico HTTP a través del cortafuegos ufw. Nginx registra varios perfiles de aplicaciones de UFW durante la instalación. Verifica los perfiles disponibles:

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Habilita el perfil más restrictivo que permita el tráfico requerido. Dado que SSL aún no está configurado, permite solo tráfico HTTP en el puerto 80:

Habilítalo ejecutando lo siguiente:

sudo ufw allow 'Nginx HTTP'

Verifica el cambio en el firewall:

sudo ufw status

Esta salida muestra que el tráfico HTTP ahora está permitido:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Para probar la funcionalidad de dominio del servidor Nginx, navega a http://your_domain usando tu navegador web preferido.

Si no tienes un nombre de dominio apuntando a tu servidor y no conoces la dirección IP pública de tu servidor, puedes encontrarla ejecutando cualquiera de los siguientes comandos:

ip addr show
hostname -I

Esto imprimirá algunas direcciones IP. Puedes probar cada una de ellas en tu navegador web.

Como alternativa, puedes comprobar qué dirección IP es accesible, tal como se ve desde otras ubicaciones en Internet:

curl -4 icanhazip.com

Escribe la dirección que recibes en tu navegador web y te llevará a la página de inicio predeterminada de Nginx:

http://<server_domain_or_IP>

Si recibe esta página, significa que ha instalado Nginx con éxito y ha habilitado el tráfico HTTP para su servidor web.

Paso 2 — Instalando MySQL

Instala MySQL para almacenar y gestionar los datos del sitio. MySQL es el sistema de gestión de bases de datos estándar para entornos PHP.

Nuevamente, utiliza 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.

Después de la instalación, ejecute el script de seguridad para eliminar las configuraciones predeterminadas inseguras y restringir el acceso a la base de datos:

sudo mysql_secure_installation

Se te mostrará una pregunta preguntando si deseas configurar el VALIDATE PASSWORD PLUGIN.

Nota: Activar esta función es algo que depende del criterio. Si se habilita, las contraseñas que no cumplan con los criterios especificados serán rechazadas por MySQL con un error. Es seguro dejar la validación desactivada, pero siempre se deben usar contraseñas fuertes y únicas para las credenciales de la base de datos.

Responde Y para 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 respondes «sí», se te pedirá que selecciones un nivel de validación de contraseña. Ten en cuenta que si eliges 2 para el nivel más alto, recibirás 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 eliges configurar el VALIDATE PASSWORD PLUGIN, tu servidor te pedirá que selecciones y confirmes una contraseña para el usuario root de MySQL. Esto no debe confundirse con el root del sistema. El usuario root de la base de datos es un usuario administrativo con privilegios completos sobre el sistema de bases 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, deberías definir una contraseña segura aquí como una medida adicional de seguridad. Hablaremos de esto en un momento.

Si activaste la validación de contraseñas, se te mostrará la fortaleza de la contraseña raíz que ingresaste y tu servidor te preguntará si deseas continuar con esa contraseña. Si estás satisfecho con tu contraseña actual, presiona Y para «sí» en el aviso:

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, presiona Y y pulsa la tecla ENTER en cada aviso. Esto eliminará algunos usuarios anónimos y la base de datos de prueba, deshabilitará los ingresos remotos del root y cargará estas nuevas reglas para que MySQL respete inmediatamente los cambios que has realizado.

Cuando termines, prueba si puedes iniciar sesión en la consola de MySQL:

sudo mysql

Esto se conectará al servidor MySQL como el usuario administrativo de la base de datos root, lo cual se infiere por el uso de sudo al ejecutar este comando. Deberías recibir la siguiente salida:

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, escribe lo siguiente:

exit

Observa que no necesitaste proporcionar una contraseña para conectarte como el usuario root, aunque hayas definido una al ejecutar el script mysql_secure_installation. 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 use contraseña. Esto puede parecer un problema de seguridad al principio, pero en realidad hace que el servidor de base de datos sea más seguro, ya que los únicos usuarios permitidos para iniciar sesión como el usuario root de MySQL son los usuarios del sistema con privilegios de sudo conectándose 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ás usar el usuario administrativo root de la base de datos para conectarte desde tu aplicación PHP.

Para una mayor seguridad, es mejor tener cuentas de usuario dedicadas con privilegios más limitados configuradas para cada base de datos, especialmente si planeas tener varias bases de datos alojadas en tu servidor.

Nota: Algunas versiones antiguas de la biblioteca nativa de MySQL para PHP mysqlnd no soportan caching_sha2_authentication, el método de autenticación predeterminado para los usuarios creados en MySQL 8. Por esa razón, al crear usuarios de base de datos para aplicaciones PHP en MySQL 8, puede ser necesario asegurarse de que estén configurados para usar mysql_native_password en su lugar. Mostraremos cómo hacerlo en el Paso 6.

Tu servidor MySQL ya está instalado y protegido. A continuación, instalarás PHP, el último componente del stack LEMP.

Paso 3 – Instalando PHP

Instala PHP para procesar código y generar contenido dinámico. Nginx requiere un programa externo para el procesamiento de PHP.

PHP-FPM ("administrador de procesos FastCGI") maneja el procesamiento de PHP de manera eficiente con funciones adicionales de seguridad, ofreciendo un mejor rendimiento para sitios web basados en PHP. Instala php-fpm para enrutar las solicitudes PHP desde Nginx, y php-mysql para habilitar la comunicación entre PHP y MySQL. Los paquetes principales de PHP se instalan automáticamente como dependencias.

Para instalar los paquetes php8.1-fpm y php-mysql, ejecuta:

sudo apt install php8.1-fpm php-mysql

Cuando se le solicite, presione Y y ENTER para confirmar la instalación.

Verifica que PHP-FPM esté en funcionamiento:

sudo systemctl status php8.1-fpm

Deberías ver una salida que muestre que PHP-FPM está activo:

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded
     Active: active (running)

También puedes verificar la versión de PHP:

php -v
PHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x

Configura Nginx para usar estos componentes de PHP.

Paso 4 — Configurar Nginx para utilizar el procesador PHP

Crea bloques de servidor de Nginx (similares a los hosts virtuales de Apache) para encapsular la configuración y alojar múltiples dominios en un solo servidor. Esta guía usa your_domain como un nombre de dominio de ejemplo.

Información: Para aprender más sobre cómo configurar un nombre de dominio con Linux-Console.net, lea nuestra introducción al DNS de Linux-Console.net.

En Ubuntu 22.04, Nginx habilita un bloque de servidor predeterminado que sirve documentos desde /var/www/html. Para múltiples sitios, crea una estructura de directorios dentro de /var/www para tu_dominio, dejando /var/www/html como el directorio predeterminado de respaldo.

Crea el directorio web raíz para tu_dominio de la siguiente manera:

sudo mkdir /var/www/your_domain

A continuación, asigna la propiedad del directorio con la variable de entorno $USER, que hará referencia a tu usuario actual del sistema:

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

Luego, abre un nuevo archivo de configuración en el directorio sites-available de Nginx usando tu editor de línea de comandos preferido. Aquí, utilizaremos nano:

sudo nano /etc/nginx/sites-available/your_domain

Esto creará un nuevo archivo en blanco. Inserta la siguiente configuración básica:

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/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 puerto 80, 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 dará prioridad a los archivos index para este sitio web. Es una práctica común listar los archivos index.html con mayor precedencia que los archivos index.php para permitir configurar rápidamente una página de mantenimiento en aplicaciones PHP. Puedes ajustar estos ajustes para que se adapten mejor a las necesidades de tu aplicación.
  • server_name — Define los nombres de dominio y/o direcciones IP a los que este bloque de servidor debe responder. Apunta esta directiva al nombre de dominio o a la dirección IP pública de tu servidor.
  • location / — El primer bloque de ubicación incluye una directiva try_files, 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 se encarga del procesamiento real de PHP al dirigir Nginx al archivo de configuración fastcgi-php.conf y al archivo php8.1-fpm.sock, que declara qué socket está asociado con php8.1-fpm.
  • location ~ /\.ht — El último bloque de ubicación se ocupa de los archivos .htaccess, que Nginx no procesa. Al agregar la directiva deny all, si por casualidad algún archivo .htaccess llega a la raíz del documento, no se servirá a los visitantes.

Cuando termines de editar, guarda y cierra el archivo. Si estás usando nano, puedes hacerlo presionando CTRL+X y luego Y y ENTER para confirmar.

Activa tu configuración vinculando al archivo de configuración desde el directorio sites-enabled de Nginx:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

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

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

Nota: Si alguna vez necesitas restaurar la configuración predeterminada, puedes hacerlo recreando el enlace simbólico, de la siguiente manera:

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 recargue. Puede probar su configuración en busca de errores de sintaxis ejecutando lo siguiente:

sudo nginx -t

Si se informan errores, vuelva a su archivo de configuración para revisar su contenido antes de continuar.

Cuando estés listo, recarga Nginx para aplicar los cambios:

sudo systemctl reload nginx

Tu nuevo sitio web ya está activo, pero la raíz web /var/www/tu_dominio todavía está vacía. Crea un archivo index.html en esa ubicación para que puedas comprobar que tu nuevo bloque de servidor funciona como se espera:

nano /var/www/your_domain/index.html

Incluye el siguiente contenido en este archivo:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Ahora abre tu navegador y accede al nombre de dominio o la dirección IP de tu servidor, tal como se indica en la directiva server_name dentro del archivo de configuración de tu bloque de servidor:

http://server_domain_or_IP

Recibirás una página como la siguiente:

Si ve esta página, significa que el bloque de su servidor Nginx está funcionando como se esperaba.

Puedes dejar este archivo en su lugar como una página de inicio temporal para tu aplicación hasta que configures un archivo index.php para reemplazarlo.

Advertencia: Después de agregar su archivo index.php, asegúrese de eliminar o renombrar el archivo index.html de su raíz de documentos. Si ambos archivos existen, Nginx servirá index.html por defecto, y su página PHP no se mostrará; esto es una fuente común de confusión para usuarios nuevos.

Tu pila LEMP ahora está completamente configurada. En el siguiente paso, crearás un script PHP para verificar que Nginx realmente puede manejar archivos .php dentro de tu sitio web recién configurado.

Paso 5: Probar PHP con Nginx

Tu pila LEMP ahora debería estar completamente configurada. Puedes probarla para validar que Nginx pueda pasar correctamente los archivos .php a tu procesador PHP.

Puedes hacer esto creando un archivo PHP de prueba en la raíz de tu documento. Abre un nuevo archivo llamado info.php dentro de la raíz de tu documento en tu editor de texto preferido:

nano /var/www/your_domain/info.php

Agrega las siguientes líneas en el nuevo archivo. Este es un código PHP válido que devolverá información sobre tu servidor:

<?php
phpinfo();

Cuando hayas terminado, guarda y cierra el archivo.

Ahora puedes acceder a esta página en tu navegador web visitando el nombre de dominio o la dirección IP pública que hayas configurado en tu archivo de configuración de Nginx, seguido de /info.php:

http://server_domain_or_IP/info.php

Recibirá una página web que contiene información detallada sobre su servidor:

Después de revisar la información relevante sobre tu servidor PHP a través de esa página, es mejor eliminar el archivo que creaste, ya que contiene información sensible sobre tu entorno PHP y tu servidor Ubuntu. Puedes usar rm para eliminar ese archivo:

sudo rm /var/www/your_domain/info.php

Siempre puedes regenerar este archivo si lo necesitas más adelante.

Paso 6 — Probar la conexión a la base de datos desde PHP (Opcional)

Si quieres probar si PHP puede conectarse a MySQL y ejecutar consultas en la base de datos, puedes crear una tabla de prueba con datos ficticios y consultar su contenido desde un script en PHP. Antes de hacerlo, necesitas crear una base de datos de prueba y un nuevo usuario de MySQL correctamente configurado para acceder a ella.

Nota: Algunas versiones antiguas de la biblioteca nativa de PHP para MySQL mysqlnd no son compatibles con caching_sha2_authentication, el método de autenticación predeterminado para MySQL 8, por lo que puede ser necesario asegurarse de que estén configuradas para usar mysql_native_password en su lugar.

Crearemos una base de datos llamada example_database y un usuario llamado example_user, pero puedes reemplazar estos nombres por otros diferentes.

Primero, conéctate a la consola de MySQL usando la cuenta root:

sudo mysql

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

CREATE DATABASE example_database;

Ahora puedes crear un nuevo usuario y otorgarle todos los privilegios en la base de datos personalizada que has creado.

El siguiente comando crea un nuevo usuario llamado example_user, utilizando mysql_native_password como el método de autenticación predeterminado. Estamos definiendo la contraseña de este usuario como password, pero deberías reemplazar este valor con una contraseña segura de tu elección.

CREATE USER 'example_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Ahora necesitamos dar a este usuario permisos sobre la base de datos example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

Esto otorgará al usuario example_user privilegios completos sobre la base de datos example_database, mientras que se evita que este usuario cree o modifique otras bases de datos en su servidor.

Ahora sal del shell de MySQL con el siguiente comando:

exit

Puedes probar si el nuevo usuario tiene los permisos adecuados iniciando sesión nuevamente en la consola de MySQL, esta vez usando las credenciales del usuario personalizado. Observa la bandera -p en este comando, la cual te pedirá la contraseña utilizada al crear el usuario example_user:

mysql -u example_user -p

Después de iniciar sesión en la consola de MySQL, confirma que tienes acceso a la base de datos example_database:

SHOW DATABASES;

Esto devolverá la siguiente salida:

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

A continuación, crearemos una tabla de prueba llamada todo_list. Desde la consola de MySQL, ejecuta la siguiente instrucción:

CREATE TABLE example_database.todo_list (

 item_id INT AUTO_INCREMENT,

 content VARCHAR(255),

 PRIMARY KEY(item_id)

);

Inserta unas filas de contenido en la tabla de prueba. Es posible que desees repetir el siguiente comando varias veces, utilizando diferentes valores:

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

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

SELECT * FROM example_database.todo_list;

Tu salida debería mostrarse de la siguiente manera:

+---------+--------------------------+
| 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 tienes datos válidos en tu tabla de prueba, puedes salir de la consola de MySQL:

exit

Ahora puedes crear el script PHP que se conectará a MySQL y consultará tu contenido. Crea un nuevo archivo PHP en tu directorio raíz web personalizado usando tu editor preferido. Usaremos nano para eso:

nano /var/www/your_domain/todo_list.php

El siguiente script de PHP se conecta a la base de datos MySQL y consulta el contenido de la tabla todo_list, mostrando los resultados en una lista. Si hay un problema con la conexión a la base de datos, generará una excepción.

Agrega el siguiente contenido a tu script 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();
}

Guarda y cierra el archivo cuando hayas terminado de editar.

Ahora puedes acceder a esta página en tu navegador web visitando el nombre de dominio o la dirección IP pública configurada para tu sitio web, seguido de /todo_list.php:

http://server_domain_or_IP/todo_list.php

Deberías recibir una página como la siguiente, que muestra el contenido que has insertado en tu tabla de prueba:

Eso significa que tu entorno PHP está listo para conectarse e interactuar con tu servidor MySQL.

Preguntas Frecuentes

¿Para qué se utiliza la pila LEMP?

La pila LEMP aloja sitios web y aplicaciones dinámicas basadas en PHP, incluyendo WordPress, Laravel, Magento, Drupal y proyectos PHP personalizados. Es especialmente eficaz para sitios de alto tráfico que requieren un manejo eficiente de conexiones concurrentes.

¿Cuál es la diferencia entre las pilas LEMP y LAMP?

LEMP utiliza Nginx, que maneja las conexiones de manera asincrónica con una arquitectura basada en eventos, siendo eficiente para usuarios concurrentes. LAMP utiliza Apache, que tradicionalmente crea un hilo por solicitud (aunque el Apache moderno soporta modos basados en eventos). LEMP generalmente ofrece un mejor rendimiento para contenido estático y escenarios de alta concurrencia, mientras que LAMP proporciona una configuración de .htaccess más sencilla y un soporte de módulos más amplio.

¿Qué versión de Ubuntu debería usar para LEMP?

Ubuntu 22.04 LTS es el objetivo principal de esta guía, con PHP 8.1, MySQL 8.0 y Nginx con soporte a largo plazo. Ubuntu 24.04 LTS (última versión) incluye PHP 8.3 por defecto y funciona con esta guía ajustando las rutas de los sockets de PHP-FPM y los números de versión según corresponda.

¿Cómo instalo el stack LEMP en Ubuntu 24.04?

Sigue estos pasos principales:

  1. Instalar Nginx: sudo apt install nginx
  2. Instalar MySQL: sudo apt install mysql-server
  3. Ejecuta el script de seguridad de MySQL: sudo mysql_secure_installation
  4. Instalar PHP-FPM: sudo apt install php-fpm php-mysql
  5. Configurar un bloque de servidor Nginx con integración de PHP-FPM
  6. Prueba con info.php y conexión a la base de datos

Consulta la guía completa en los pasos 1-6 de arriba.

¿Qué versión de PHP debería instalar con Nginx y MySQL?

Usa la versión de PHP predeterminada de tu Ubuntu para la mejor compatibilidad:

  • Ubuntu 22.04: PHP 8.1 (instalado mediante php8.1-fpm)
  • Ubuntu 24.04: PHP 8.3 (ajusta los comandos a php8.3-fpm para esta versión)

Ambas versiones funcionan excelentemente con Nginx y MySQL 8.0, soportan frameworks modernos y reciben actualizaciones de seguridad activas.

¿Cómo configuro Nginx para procesar archivos PHP?

Agrega un bloque location ~ \.php$ a la configuración de tu servidor Nginx que enrute las solicitudes PHP a PHP-FPM mediante un socket Unix:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Ajusta la ruta del socket según tu versión de PHP, prueba con sudo nginx -t y recarga con sudo systemctl reload nginx.

¿Por qué recibo un error “502 Bad Gateway” después de instalar PHP-FPM?

Los errores 502 indican que Nginx no puede comunicarse con PHP-FPM. Causas comunes:

  1. PHP-FPM no se está ejecutando: Verifica con sudo systemctl status php8.1-fpm y empieza si es necesario
  2. Ruta de socket incorrecta: Verifica que /run/php/php8.1-fpm.sock exista y coincida con tu configuración de Nginx
  3. Problema de permisos: Asegúrese de que el usuario de Nginx (www-data) pueda acceder al socket
  4. Error de configuración de PHP-FPM: Revisa los registros en /var/log/php8.1-fpm.log

Solución: Reinicie ambos servicios:

sudo systemctl restart php8.1-fpm nginx

¿Cómo aseguro MySQL después de la instalación?

Ejecute el script de seguridad incorporado:

sudo mysql_secure_installation

Sigue las indicaciones para:

  • Habilitar el complemento de validación de contraseñas
  • Establecer una contraseña raíz fuerte
  • Eliminar usuarios anónimos
  • Desactivar el inicio de sesión remoto como root
  • Eliminar base de datos de prueba
  • Recargar privilegios

Para las bases de datos de aplicaciones, cree usuarios dedicados con privilegios limitados en lugar de usar la cuenta root.

¿Puedo ejecutar varios sitios web en un solo servidor LEMP?

Sí, crea bloques de servidor Nginx separados para cada dominio:

  1. Crear directorio: sudo mkdir -p /var/www/second_domain
  2. Crear bloque de servidor: sudo nano /etc/nginx/sites-available/second_domain
  3. Configure con directivas únicas server_name y root
  4. Habilitar: sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/
  5. Probar y recargar: sudo nginx -t && sudo systemctl reload nginx

Cada sitio puede tener configuraciones de PHP y usuarios de base de datos separados.

¿Cómo puedo actualizar PHP a una versión más reciente?

Las actualizaciones de paquetes de Ubuntu manejan automáticamente las versiones menores. Para las actualizaciones de versiones principales:

  1. Agregue el PPA PHP de Ondřej (repositorio de terceros confiable):

    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
  2. Instalar nueva versión de PHP-FPM:

    sudo apt install php8.3-fpm php8.3-mysql -y
  3. Actualiza la ruta del socket en la configuración de Nginx a /run/php/php8.3-fpm.sock

  4. Probar y recargar Nginx

  5. Opcionalmente, elimina la versión antigua: sudo apt purge php8.1-fpm

Siempre prueba en el entorno de pruebas antes de actualizar los sistemas de producción.

Solución de problemas comunes

Error 502 Puerta de enlace incorrecta

El problema más común del stack LEMP ocurre cuando Nginx no puede comunicarse con PHP-FPM:

Verificar estado de PHP-FPM:

sudo systemctl status php8.1-fpm

Verificar ruta del socket:

ls -la /run/php/

La salida esperada debería mostrar el archivo php8.1-fpm.sock.

Soluciones comunes:

  1. Reiniciar PHP-FPM: sudo systemctl restart php8.1-fpm
  2. Verifique que la ruta del socket del bloque de servidor Nginx coincida con el socket real de PHP-FPM
  3. Verifica los permisos del archivo: sudo chown www-data:www-data /run/php/php8.1-fpm.sock

Errores de Permiso Denegado

Corregir los permisos del directorio web:

sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain

Problemas de conexión a MySQL

Restablecer la contraseña root de MySQL:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

Verificar el servicio de MySQL:

sudo systemctl status mysql

PHP no se está procesando

Verificar módulos de PHP:

php -m | grep -E 'mysql|fpm'

Verificar la configuración de PHP-FPM:

sudo nginx -t
sudo php-fpm8.1 -t

Depurar errores 404:

  • Verifica que index.php esté listado en la directiva index de Nginx
  • Verificar si el archivo existe: ls -la /var/www/your_domain/
  • Revisar los registros de errores de Nginx: sudo tail -f /var/log/nginx/error.log

Conclusión

En esta guía, construiste una base flexible para servir sitios web y aplicaciones PHP a tus visitantes, utilizando Nginx como servidor web y MySQL como sistema de base de datos. También puedes hacer esto con un servidor web Apache; consulta nuestro tutorial sobre Cómo Instalar la pila Linux, Apache, MySQL, PHP (LAMP) en Ubuntu. También puedes proteger tu sitio con Let’s Encrypt, que proporciona certificados gratuitos y confiables. Aprende a hacerlo con nuestra guía sobre Let’s Encrypt para Apache.

Gracias por aprender con la comunidad de Linux-Console.net.