Cómo instalar LAMP en Ubuntu 24.04

En este tutorial aprenderás a instalar un entorno LAMP listo para producción en Ubuntu 24.04.

LAMP son las siglas de Linux, Apache, MySQL y PHP.

Esta configuración utiliza PHP-FPM con el MPM «event» de Apache en lugar del antiguo mod_php. Es más rápido, consume mucha menos memoria bajo carga y es la configuración que necesitas en un servidor real. Con mod_php, cada proceso de Apache lleva un intérprete PHP completo (unos 60 MB cada uno), por lo que un pico de tráfico puede generar tantos procesos que agoten tu RAM y bloqueen todo el sistema. PHP-FPM mantiene PHP en un grupo separado que puedes limitar, así que un pico se pone en cola en lugar de bloquear el servidor.

Primero instalarás todos los paquetes necesarios y, a continuación, configurarás cada uno de ellos.

1. Instala los paquetes LAMP

Actualiza y mejora todo primero.

sudo apt update
sudo apt upgrade -y

Instala Apache.

sudo apt install apache2

Instala el servidor MySQL.

sudo apt install mysql-server

Instala PHP-FPM y las extensiones que necesita un sitio web típico (incluido WordPress).

sudo apt install php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip php-intl php-bcmath

En Ubuntu 24.04, esto instala PHP 8.3 y los paquetes correspondientes php8.3-* extensiones. Ten en cuenta que instalamos php-fpm, no el php paquete. Instalación php Si lo instalas junto con Apache, se instalaría mod_php y Apache pasaría a utilizar el MPM prefork, que es más lento, y eso es justo lo que queremos evitar.

2. Configurar Apache con PHP-FPM

Activa los dos módulos que permiten a Apache pasar las solicitudes PHP a PHP-FPM y, a continuación, activa la configuración de FPM que viene con el paquete.

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.3-fpm

Asegúrate de que Apache utilice el MPM «event». En una instalación limpia sin mod_php, esta ya es la configuración predeterminada, pero estos comandos lo dejan claro y garantizan que funcione correctamente en cualquier caso.

sudo a2dismod mpm_prefork 2>/dev/null
sudo a2enmod mpm_event

Comprueba que Apache esté en funcionamiento y verifica la versión.

sudo systemctl status apache2
apache2 -v

Abre un navegador y entra en la dirección IP de tu servidor.

http://your_server_ip/

Si ves la página predeterminada de Apache, todo va bien.

2.1 Configurar un host virtual para tu dominio

En este ejemplo se utiliza mydomain.com. Sustitúyelo por tu propio dominio cada vez que aparezca.

Crea el archivo de configuración del sitio.

sudo vi /etc/apache2/sites-available/mydomain.com.conf

Añade este contenido.

<VirtualHost *:80>
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    ServerAdmin webmaster@mydomain.com
    DocumentRoot /var/www/mydomain.com/public_html

    <Directory /var/www/mydomain.com/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/mydomain.com.error.log
    CustomLog ${APACHE_LOG_DIR}/mydomain.com.access.log combined
</VirtualHost>

Hay dos cosas que hay que tener en cuenta aquí. Permitir anulación: Todos se encuentra dentro de este sitio web <Directory> bloque, así que WordPress .htaccess Estas normas solo se aplican a este sitio. Esta es la forma correcta de hacerlo en un entorno de producción. No actives Permitir anulación: Todos a nivel mundial en apache2.conf, porque eso hace que Apache compruebe si .htaccess archivos de todos los directorios en cada solicitud, lo cual es más lento y exhaustivo de lo que necesitas. Opciones - Índices Además, desactiva la visualización de directorios para que los visitantes no puedan ver tus archivos.

Crea el directorio raíz de los documentos y configura los permisos.

sudo mkdir -p /var/www/mydomain.com/public_html
sudo chown -R www-data:www-data /var/www/mydomain.com/public_html
sudo chmod -R 755 /var/www/mydomain.com/public_html

Activa tu sitio, desactiva el predeterminado y reinicia Apache.

sudo a2ensite mydomain.com.conf
sudo a2dissite 000-default.conf
sudo systemctl reload apache2

3. Configura la base de datos MySQL

Lo primero es asegurar la instalación.

sudo mysql_secure_installation

Respuesta Y a estas indicaciones.

Remove anonymous users?
Disallow root login remotely?
Remove test database and access to it?
Reload privilege tables now?

También se te preguntará si quieres configurar el componente de validación de contraseñas. Es recomendable activarlo en el entorno de producción, pero recuerda que cualquier contraseña que crees a partir de ese momento deberá cumplir con la política establecida.

Ahora conéctate y crea tu base de datos y tu usuario.

sudo mysql
CREATE DATABASE webdata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'CHANGE_THIS_TO_A_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON webdata.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Aquí hay algunos detalles de producción que hay que tener en cuenta. El ámbito de aplicación del usuario es 'webuser'@'localhost', por lo que solo puede conectarse desde el propio servidor. Si omites el host, MySQL crea 'webuser'@'%', que permite conexiones desde cualquier host. El utf8mb4 El juego de caracteres es compatible con todo el Unicode (incluidos los emojis) y es el que WordPress espera por defecto. Y usa una contraseña de verdad, no la palabra “contraseña”.

4. Configura PHP

Con PHP-FPM, el archivo que editas es el FPM php.ini, no el de Apache.

sudo vi /etc/php/8.3/fpm/php.ini

Cambia estos valores.

error_log = /var/log/php/error.log
memory_limit = 256M
upload_max_filesize = 200M
post_max_size = 208M

Lo importante es que tamaño_máximo_de_la_publicación debe ser mayor o igual que upload_max_filesize. tamaño_máximo_de_la_publicación limita todo el cuerpo de la solicitud, así que si lanzas upload_max_filesize hasta los 200 m, pero deja tamaño_máximo_de_la_publicación Con el valor predeterminado de 8 MB, cualquier subida que supere los 8 MB seguirá fallando. Configura ambos.

Crea el directorio para el registro de errores de PHP. PHP-FPM se ejecuta como www-data, así que tiene que asumir la responsabilidad.

sudo mkdir /var/log/php
sudo chown www-data:www-data /var/log/php

Ahora ajusta el tamaño del grupo de PHP-FPM. Este es el ajuste de producción más importante, porque pm.max_children es el límite máximo de memoria que PHP puede llegar a utilizar.

sudo vi /etc/php/8.3/fpm/pool.d/www.conf

Configura estos valores.

pm = dynamic
pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pm.max_requests = 500

Cómo elegir pm.max_children: cada proceso de PHP-FPM consume entre 40 y 60 MB aproximadamente en una aplicación típica. Toma la RAM que quieras asignar a PHP y divídela por el tamaño por proceso. Por ejemplo, en un servidor de 4 GB, deja unos 1 GB para MySQL y 0,5 GB para el sistema, lo que deja unos 2,5 GB para PHP. A 60 MB por proceso, eso son unos 40 procesos secundarios, así que un punto de partida conservador es 20. Empieza con un valor bajo y auméntalo solo si ves que todos los procesos secundarios están ocupados sin que haya presión sobre la memoria. pm.max_requests = 500 recicla cada proceso tras 500 solicitudes, lo que libera la memoria que los complementos han ido ocupando con el tiempo.

Reinicia PHP-FPM y actualiza Apache para que se apliquen los cambios.

sudo systemctl restart php8.3-fpm
sudo systemctl reload apache2

5. Configura el servidor para el entorno de producción

Configura el cortafuegos. Permite primero el acceso por SSH para que no te quedes fuera, luego permite Apache y, por último, actívalo.

sudo ufw allow OpenSSH
sudo ufw allow "Apache Full"
sudo ufw enable

Reduce la información que Apache revela sobre sí mismo. Edita el archivo de configuración de seguridad.

sudo vi /etc/apache2/conf-available/security.conf

Configura estas dos directivas.

ServerTokens Prod
ServerSignature Off

A continuación, reinicia Apache.

sudo systemctl reload apache2

Ofrece tu sitio web a través de HTTPS. Un servidor de producción no debería funcionar con HTTP sin cifrar. Instala un certificado gratuito de Let’s Encrypt siguiendo Cómo instalar un certificado SSL en Ubuntu con Apache2.

Protégete contra los ataques de fuerza bruta. Los bots no paran de bombardear el SSH y las páginas de inicio de sesión. Instala fail2ban siguiendo Cómo instalar fail2ban en Ubuntu 24.04.

Asegúrate de que todos los servicios se inicien automáticamente tras reiniciar el sistema.

sudo systemctl enable apache2 mysql php8.3-fpm

6. Prueba la instalación de LAMP

Crea un archivo de prueba temporal.

sudo vi /var/www/mydomain.com/public_html/test.php

Añade este contenido. Usa la misma contraseña de la base de datos que configuraste antes.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Database Connection</title>
</head>
<body>
    <h1>Database Connection Status</h1>
    <p>
        <?php
            $servername = "localhost";
            $username = "webuser";
            $password = "CHANGE_THIS_TO_A_STRONG_PASSWORD";
            $dbname = "webdata";

            $conn = mysqli_connect($servername, $username, $password, $dbname);

            if (!$conn) {
                echo "Not Connected: " . mysqli_connect_error();
            } else {
                echo "Connected Successfully to database: " . $dbname;
            }

            mysqli_close($conn);
        ?>
    </p>
</body>
</html>

Establece el propietario.

sudo chown www-data:www-data /var/www/mydomain.com/public_html/test.php

Abre tu navegador y ve a http://mydomain.com/test.php. Si todo funciona, verás:

Conectado correctamente a la base de datos: webdata

Ahora borra el archivo de prueba. Este paso no es opcional.

sudo rm /var/www/mydomain.com/public_html/test.php

Este archivo contiene tus credenciales de la base de datos en texto sin cifrar. Nunca lo dejes en un servidor de producción. Una vez que hayas comprobado que la conexión funciona, elimínalo.

Tu pila LAMP ya está instalada, optimizada y protegida para su uso en producción. Puedes instalar WordPress o tu propia aplicación en /var/www/mydomain.com/public_html y adelante.

Preguntas frecuentes

¿Debería usar mod_php o PHP-FPM en un servidor de producción?

Usa PHP-FPM con el MPM «event» de Apache. Con mod_php, cada proceso de trabajo de Apache carga un intérprete PHP completo, por lo que cada uno necesita unos 60 MB y un pico de tráfico puede agotar tu RAM. PHP-FPM ejecuta PHP en un grupo independiente que puedes limitar con pm.max_children, para que el servidor se mantenga estable bajo carga.

¿Por qué sigue fallando la subida de mi archivo grande aunque haya aumentado el valor de `upload_max_filesize`?

Porque tamaño_máximo_de_la_publicación es demasiado bajo. Limita el tamaño total del cuerpo de la solicitud, por lo que debe ser mayor o igual a upload_max_filesize. Si upload_max_filesize es de 200 millones, pero tamaño_máximo_de_la_publicación El valor predeterminado es de 8 MB; las subidas de más de 8 MB fallan. Aumenta ambos.

¿Cómo elijo el valor de `pm.max_children` para PHP-FPM?

Divide la RAM que quieras asignar a PHP entre el tamaño medio de los procesos (entre 40 y 60 MB). En un servidor de 4 GB, tras dejar espacio para MySQL y el sistema, lo razonable es dejar entre 20 y 40 MB. Empieza con un valor bajo y auméntalo solo si todos los procesos secundarios están ocupados y aún te queda memoria libre.

¿Tengo que editar el archivo apache2.conf para habilitar AllowOverride en WordPress?

N.º de juego Permitir anulación: Todos dentro del <Directory> en su lugar, en el bloque de tu host virtual. Eso permite .htaccess solo para tu sitio, lo cual es más rápido y seguro que activarlo a nivel global en apache2.conf.

¿Está este entorno LAMP listo para WordPress?

Sí. Las extensiones de PHP instaladas aquí cumplen con los requisitos de WordPress, y la base de datos utiliza el utf8mb4 el juego de caracteres que espera WordPress, y Permitir anulación: Todos Haz que funcionen los enlaces permanentes. Añade HTTPS y fail2ban tal y como se muestra, y ya estarás listo para la producción.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *