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.
Índice
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.
