LEMP Stack · 11 min read · Oct 12, 2025

Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en Ubuntu 22.04

El stack de software LEMP es un grupo de software de código abierto que permite a un servidor alojar sitios web y aplicaciones dinámicas escritas en PHP. Es un acrónimo de L inux, Nginx (pronunciado como E ngine-X), M ySQL, y P HP.

Esta guía te mostrará cómo instalar un stack LEMP en un servidor Ubuntu 22.04. También aprenderás a instalar aplicaciones como phpMyAdmin.

Prerrequisitos

  • Un servidor que ejecute Ubuntu 22.04.
  • Un usuario no root con privilegios sudo.
  • El Firewall sin complicaciones (UFW) está habilitado y en funcionamiento.
  • Todo está actualizado. $ sudo apt update && sudo apt upgrade

Paso 1 - Configurar el Firewall

El primer paso antes de instalar cualquier paquete es configurar el firewall para permitir conexiones HTTP y HTTPS.

Verifica el estado del firewall.

$ sudo ufw status

Deberías ver algo como lo siguiente.

Estado: activo

Para                         Acción      Desde
--                         ------      ----
OpenSSH                    PERMITIR   En cualquier lugar
OpenSSH (v6)               PERMITIR   En cualquier lugar (v6)

Permitir puertos HTTP y HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Verifica el estado nuevamente para confirmar.

$ sudo ufw status
Estado: activo

Para                         Acción      Desde
--                         ------      ----
OpenSSH                    PERMITIR   En cualquier lugar
80/tcp                     PERMITIR   En cualquier lugar
443/tcp                    PERMITIR   En cualquier lugar
OpenSSH (v6)               PERMITIR   En cualquier lugar (v6)
80/tcp (v6)                PERMITIR   En cualquier lugar (v6)
443/tcp (v6)               PERMITIR   En cualquier lugar (v6)

Paso 2 - Instalar PHP

Ubuntu 22.04 viene con PHP 8.1 por defecto. Puedes instalarlo ejecutando el siguiente comando.

$ sudo apt install php-fpm php-cli php-mysqlnd php-mbstring php-xml php-gd

Hemos instalado las extensiones MySQL, CLI, GD, Mbstring y XML de PHP. Puedes instalar cualquier extensión adicional según tus requisitos.

Para mantenerte siempre en la última versión de PHP o si deseas instalar múltiples versiones de PHP, agrega el repositorio de PHP de Ondrej.

Agrega el repositorio de PHP de Ondrej.

$ sudo add-apt-repository ppa:ondrej/php

Ahora, puedes instalar cualquier versión de PHP.

$ sudo apt install php8.0-fpm php8.0-cli

Verifica la versión de PHP instalada.

$ php --version
PHP 8.1.2 (cli) (construido: Jun 13 2022 13:52:54) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    con Zend OPcache v8.1.2, Copyright (c), de Zend Technologies

Paso 3 - Instalar MySQL

Ubuntu 22.04 viene con la última versión de MySQL. Puedes instalarlo con un solo comando.

$ sudo apt install mysql-server

Verifica la versión de MySQL.

$ mysql --version
mysql  Ver 8.0.29-0ubuntu0.22.04.2 para Linux en x86_64 ((Ubuntu))

Este paso es necesario para las versiones de MySQL 8.0.28 y superiores. Ingresa a la Shell de MySQL.

$ sudo mysql

Ejecuta el siguiente comando para establecer la contraseña para tu usuario root. Asegúrate de que tenga una mezcla de números, mayúsculas, minúsculas y caracteres especiales.

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPassword12!';

Sal de la shell.

mysql> exit

Ejecuta el script de instalación segura de MySQL.

$ sudo mysql_secure_installation

Se te pedirá que instales el Componente de Validación de Contraseña. Verifica la fortaleza de las contraseñas utilizadas en MySQL. Presiona Y para instalarlo.

A continuación, se te pedirá que establezcas el nivel de la política de validación de contraseñas. Elige 2 ya que es el más fuerte.

A continuación, ingresa tu contraseña root. Presiona N para rechazar cambiarla.

Presiona Y para eliminar usuarios anónimos, deshabilitar inicios de sesión remotos de root, eliminar la base de datos de prueba y recargar las tablas de privilegios.

Paso 4 - Configurar MySQL

Inicia sesión en la shell de MySQL. Ingresa tu contraseña root cuando se te solicite.

$ sudo mysql -u root -p

Crea una base de datos de ejemplo.

mysql> CREATE DATABASE exampledb;

Crea una cuenta de usuario SQL.

mysql> CREATE USER 'exampleuser'@'localhost' IDENTIFIED BY 'YourPassword2!';

Otorga todos los privilegios en la base de datos al usuario.

mysql> GRANT ALL PRIVILEGES ON exampledb.* TO 'exampleuser'@'localhost';

Actualiza los privilegios del usuario.

mysql> FLUSH PRIVILEGES;

Sal de la shell.

mysql> exit

Volvamos a iniciar sesión en la shell de MySQL usando el nuevo usuario creado.

$ sudo mysql -u exampleuser -p

Crea una tabla de prueba.

mysql> CREATE TABLE exampledb.name_list ( sno INT AUTO_INCREMENT, content VARCHAR(255), PRIMARY KEY(sno) );

Inserta datos de prueba.

mysql> INSERT INTO exampledb.name_list (content) VALUES ('Navjot');

Repite el comando anterior varias veces para agregar más entradas. Ejecuta el siguiente comando para verificar el contenido de la tabla.

mysql> SELECT * FROM exampledb.name_list;

Recibirás la siguiente salida.

+-----+---------+
| sno | content |
+-----+---------+
|   1 | Navjot  |
|   2 | Adam    |
|   3 | Josh    |
|   4 | Peter   |
+-----+---------+
4 filas en el conjunto (0.00 sec)

Sal de la shell de MySQL.

mysql> exit

Paso 5 - Instalar Nginx

Ubuntu 22.04 viene con una versión más antigua de Nginx. Para instalar la última versión, necesitas descargar el repositorio oficial de Nginx.

Importa la clave de firma de Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Agrega el repositorio para la versión estable de Nginx.

$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list

Actualiza los repositorios del sistema.

$ sudo apt update

Instala Nginx.

$ sudo apt install nginx

Verifica la instalación.

$ nginx -v
nginx version: nginx/1.22.0

Paso 6 - Configurar PHP-FPM

Abre php.ini para editar.

$ sudo nano /etc/php/8.1/fpm/php.ini

Para establecer los tamaños de carga de archivos, cambia los valores de las variables upload_max_filesize y post_max_size.

upload_max_filesize = 50M
...
post_max_size = 50M

Configura el límite de memoria de PHP dependiendo de los recursos y requisitos de tu servidor.

memory_limit = 256M

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Abre el archivo /etc/php/8.0/fpm/pool.d/www.conf.

$ sudo nano /etc/php/8.0/fpm/pool.d/www.conf

Necesitamos establecer el usuario/grupo Unix de los procesos de PHP a nginx. Encuentra las líneas user=www-data y group=www-data en el archivo y cámbialas a nginx.

...
; Usuario/grupo Unix de los procesos
; Nota: El usuario es obligatorio. Si el grupo no está establecido, se utilizará el grupo del usuario por defecto
;       será utilizado.
user = nginx
group = nginx
...

Además, encuentra las líneas listen.owner=www-data y listen.group=www-data en el archivo y cámbialas a nginx.

listen.owner = nginx
listen.group = nginx

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Reinicia el proceso de PHP-fpm.

$ sudo systemctl restart php8.1-fpm

Paso 7 - Instalar phpMyAdmin

Descarga el archivo comprimido de phpMyAdmin para el idioma inglés.

$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.0/phpMyAdmin-5.2.0-english.tar.gz

Crea un directorio público para el sitio.

$ sudo mkdir /var/www/html/example.com -p

Extrae el archivo comprimido en el directorio público.

$ sudo tar -xzvf phpMyAdmin-5.2.0-english.tar.gz -C /var/www/example.com

Cambia al directorio público.

$ cd /var/www/html/example.com

Cambia el nombre del directorio extraído a algo poco obvio para mejorar la seguridad.

$ sudo mv phpMyAdmin-5.2.0-english sm175

Paso 8 - Configurar phpMyAdmin

Copia el archivo de configuración de muestra.

$ sudo cp sm175/config.sample.inc.php sm175/config.inc.php

Abre el archivo de configuración para editar.

$ sudo nano sm175/config.inc.php

Encuentra la línea $cfg['blowfish_secret'] = ''; y ingresa una cadena aleatoria de 32 caracteres para la autenticación basada en cookies.

Puedes usar el generador de blowfish en línea de phpSolved o hacerlo a través de la línea de comandos.

Copia el valor y pégalo como se muestra.

$cfg['blowfish_secret'] = 'Tc/HfLPBOAPxJ-rhQP}HJoZEK69c3j:m';

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Cambia la propiedad del sitio y de phpMyAdmin al servidor Nginx.

$ sudo chown -R nginx:nginx /var/www/html/example.com

Elimina el directorio de configuración de phpMyAdmin.

$ sudo rm -rf /var/www/html/example.com/sm175/setup

Paso 9 - Configurar Opcache

Opcache es el sistema de caché de PHP. Funciona guardando el bytecode de script precompilado en la memoria, por lo que cada vez que un usuario visita una página, se carga más rápido. Opcache está instalado por defecto. Para verificar, revisa la versión de PHP.

$ php --version
PHP 8.1.2 (cli) (construido: Jun 13 2022 13:52:54) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
    con Zend OPcache v8.1.2, Copyright (c), de Zend Technologies

Esto nos dice que Opcache está instalado y disponible. En caso de que no aparezca aquí, puedes instalarlo manualmente ejecutando el siguiente comando.

$ sudo apt install php-opcache

Para cambiar la configuración de Opcache, abre el archivo /etc/php/8.1/fpm/conf.d/10-opcache.ini para editar.

$ sudo nano /etc/php/8.1/fpm/conf.d/10-opcache.ini

La siguiente configuración debería ayudarte a comenzar a usar Opcache y se recomienda generalmente para un buen rendimiento. Puedes habilitar una configuración descomentándola al eliminar el punto y coma al frente.

opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Paso 10 - Instalar Certbot para SSL

Necesitamos instalar Certbot para generar certificados SSL gratuitos ofrecidos por Let’s Encrypt.

Puedes instalar Certbot usando el repositorio de Ubuntu o obtener la última versión usando la herramienta Snapd. Usaremos la versión de Snapd.

Ubuntu 22.04 viene con Snapd instalado por defecto. Ejecuta los siguientes comandos para asegurarte de que tu versión de Snapd esté actualizada.

$ sudo snap install core
$ sudo snap refresh core

Instala Certbot.

$ sudo snap install --classic certbot

Usa el siguiente comando para asegurarte de que el comando Certbot se pueda ejecutar creando un enlace simbólico al directorio /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Paso 11 - Probar un sitio de demostración

Crear el sitio

Crea y abre una página de prueba para editar.

$ sudo nano /var/www/html/example.com/index.php

Pega el siguiente código en él.

Lista de Miembros
    "; foreach($db->query("SELECT content FROM $table") as $row) { echo "
  1. " . $row['content'] . "
  2. "; } echo "
"; } catch (PDOException $e) { print "Error!: " . $e->getMessage() . "
"; die(); }

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Crear un Certificado SSL

Ejecuta el siguiente comando para generar un Certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d example.com

El comando anterior descargará un certificado en el directorio /etc/letsencrypt/live/example.com en tu servidor.

Genera un certificado de grupo Diffie-Hellman.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Abre el archivo /etc/letsencrypt/renewal/example.com.conf para editar.

$ sudo nano /etc/letsencrypt/renewal/example.com.conf

Pega el siguiente código al final.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Hemos generado el certificado SSL utilizando la opción independiente de Certbot. Ejecuta su servidor web para crear el certificado, lo que significa que Nginx debe estar apagado durante la renovación. Los comandos pre_hook y post_hook se ejecutan antes y después de la renovación para apagar y reiniciar automáticamente el servidor Nginx, por lo que no se requiere intervención manual.

Para verificar si la renovación de SSL está funcionando correctamente, haz una prueba del proceso.

$ sudo certbot renew --dry-run

Si no ves errores, estás listo. Tu certificado se renovará automáticamente.

Configurar Nginx

Crea y abre el archivo /etc/nginx/conf.d/example.conf para editar.

$ sudo nano /etc/nginx/conf.d/example.conf

Pega el siguiente código en él.

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;

    access_log  /var/log/nginx/example.com.access.log;
    error_log   /var/log/nginx/example.com.error.log;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    root /var/www/html/example.com;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Pasar scripts PHP al servidor FastCGI
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# forzar HTTPS
server {
    listen       80;
    listen       [::]:80;
    server_name  example.com;
    return 301   https://$host$request_uri;
}

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Abre el archivo /etc/nginx/nginx.conf para editar.

$ sudo nano /etc/nginx/nginx.conf

Agrega la siguiente línea antes de la línea include /etc/nginx/conf.d/*.conf;.

server_names_hash_bucket_size  64;

Guarda el archivo presionando Ctrl + X y luego Y cuando se te solicite.

Verifica tu configuración de Nginx.

$ sudo nginx -t

Si no ves errores, significa que estás listo para continuar. Inicia el servidor Nginx.

$ sudo systemctl start nginx

Carga tu sitio web visitando https://example.com en tu navegador y verás la siguiente página.

Salida del sitio de prueba LEMP

Puedes acceder a tu instalación de phpMyAdmin visitando la URL https://example.com/sm175 en tu navegador. Puedes ingresar tu usuario root o el usuario creado anteriormente para iniciar sesión.

Conclusión

Esto concluye nuestro tutorial donde aprendiste a configurar un stack LEMP en un servidor Ubuntu 22.04 y crear un sitio de demostración. Si tienes alguna pregunta, publícalas en los comentarios a continuación.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.