Introducción
Nginx (pronunciado "engine-x") es un servidor web de alto rendimiento, conocido por su velocidad, estabilidad y bajo consumo de recursos. Combinado con PHP-FPM (FastCGI Process Manager), forma una potente pila para alojar aplicaciones PHP modernas como WordPress, Laravel, Symfony o Drupal.
¿Por qué elegir Nginx + PHP-FPM?
| Característica | Apache + mod_php | Nginx + PHP-FPM |
|---|---|---|
| Memoria | Alto consumo | Baja huella |
| Conexiones simultáneas | Limitado | Miles |
| Archivos estáticos | Bueno | Excelente |
| Configuración | .htaccess distribuido | Centralizada |
| Rendimiento | Bueno | Excelente |
Versiones incluidas por SO
| Sistema | Nginx | PHP | Kernel |
|---|---|---|---|
| Debian 13 "Trixie" | 1.26 | 8.4 | 6.12 LTS |
| Ubuntu 24.04 LTS | 1.24 | 8.3 | 6.8 |
📋 Requisitos previos
- Un VPS con Ubuntu 24.04 LTS o Debian 13 "Trixie"
- Acceso de root o usuario con privilegios de sudo
- Conexión SSH establecida
- Nombre de dominio apuntando a la IP del VPS (opcional pero recomendado)
🔄 Paso 1: Actualizar el sistema
Antes de cualquier instalación, actualice los paquetes del sistema:
sudo apt update && sudo apt upgrade -y
Si se requiere un reinicio:
[ -f /var/run/reboot-required ] && sudo reboot
📦 Paso 2: Instalar Nginx
Instalación
sudo apt install nginx -y
Verificar la instalación
nginx -v
Resultado esperado:
- Debian 13:
nginx version: nginx/1.26.x - Ubuntu 24.04:
nginx version: nginx/1.24.x
Verificar el estado del servicio
sudo systemctl status nginx
El servicio debe mostrar active (running).
Comandos de gestión de Nginx
| Acción | Comando |
|---|---|
| Iniciar | sudo systemctl start nginx |
| Detener | sudo systemctl stop nginx |
| Reiniciar | sudo systemctl restart nginx |
| Recargar configuración | sudo systemctl reload nginx |
| Activar en el arranque | sudo systemctl enable nginx |
| Desactivar en el arranque | sudo systemctl disable nginx |
| Probar la configuración | sudo nginx -t |
Configurar el firewall (UFW)
Si UFW está activado, permita el tráfico HTTP y HTTPS:
# Verificar el estado de UFW
sudo ufw status
# Permitir Nginx (HTTP + HTTPS)
sudo ufw allow 'Nginx Full'
# O permitir por separado
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Probar la instalación
Abra su navegador y acceda a http://SU_IP_VPS. Debería ver la página de inicio de Nginx con el mensaje "Welcome to nginx!".
🐘 Paso 3: Instalar PHP-FPM
Para Debian 13 "Trixie" (PHP 8.4)
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-soap php8.4-opcache php8.4-readline -y
Para Ubuntu 24.04 LTS (PHP 8.3)
sudo apt install php8.3-fpm php8.3-cli php8.3-common php8.3-mysql \
php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml \
php8.3-bcmath php8.3-intl php8.3-soap php8.3-opcache php8.3-readline -y
Instalación de una versión específica a través de PPA (solo en Ubuntu)
Si necesita otra versión de PHP en Ubuntu:
# Agregar el repositorio PPA de Ondřej
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# Ejemplo: instalar PHP 8.4
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-soap php8.4-opcache -y
Verificar la instalación de PHP
php -v
Resultado esperado:
- Debian 13:
PHP 8.4.x (cli) - Ubuntu 24.04:
PHP 8.3.x (cli)
Verificar el estado de PHP-FPM
Debian 13:
sudo systemctl status php8.4-fpm
Ubuntu 24.04:
sudo systemctl status php8.3-fpm
El servicio debe mostrar active (running).
Identificar el socket de PHP-FPM
El socket es crucial para la comunicación entre Nginx y PHP:
ls /run/php/
Resultado típico:
- Debian 13:
php8.4-fpm.sock - Ubuntu 24.04:
php8.3-fpm.sock
⚙️ Paso 4: Configurar Nginx para PHP-FPM
Modificar la configuración por defecto
Edite el archivo de configuración por defecto:
sudo nano /etc/nginx/sites-available/default
Configuración para Debian 13 (PHP 8.4)
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
# Configuración PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Bloquear el acceso a los archivos .htaccess
location ~ /\.ht {
deny all;
}
}
Configuración para Ubuntu 24.04 (PHP 8.3)
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
# Configuración PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Bloquear el acceso a los archivos .htaccess
location ~ /\.ht {
deny all;
}
}
Probar la configuración
sudo nginx -t
Resultado esperado:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Recargar Nginx
sudo systemctl reload nginx
✅ Paso 5: Probar PHP con Nginx
Crear un archivo de prueba PHP
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Acceder a la página de prueba
Abre tu navegador: http://VOTRE_IP_VPS/info.php
Deberías ver la página phpinfo() mostrando:
- Versión de PHP (8.4.x o 8.3.x)
- Server API: FPM/FastCGI
- Extensiones instaladas
- Variables de configuración
Eliminar el archivo de prueba (seguridad)
sudo rm /var/www/html/info.php
⚠️ Seguridad: Nunca dejes un archivo
phpinfo()en producción, expone información sensible.
🌐 Paso 6: Crear un Virtual Host (Bloque de Servidor)
Los virtual hosts permiten alojar varios sitios en el mismo servidor.
Crear el directorio del sitio
sudo mkdir -p /var/www/monsite.com/html
sudo chown -R $USER:$USER /var/www/monsite.com
sudo chmod -R 755 /var/www/monsite.com
Crear una página de inicio
nano /var/www/monsite.com/html/index.php
Agrega:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Bienvenido a MonSite.com</title>
<style>
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>¡MonSite.com está funcionando!</h1>
<p>Nginx + PHP-FPM configurados con éxito.</p>
<p>Versión PHP: <?php echo phpversion(); ?></p>
</body>
</html>
Crear la configuración del virtual host
sudo nano /etc/nginx/sites-available/monsite.com
Para Debian 13 (PHP 8.4):
server {
listen 80;
listen [::]:80;
server_name monsite.com www.monsite.com;
root /var/www/monsite.com/html;
index index.php index.html index.htm;
# Logs
access_log /var/log/nginx/monsite.com.access.log;
error_log /var/log/nginx/monsite.com.error.log;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# Seguridad - bloquear archivos ocultos
location ~ /\. {
deny all;
}
# Cache de archivos estáticos
location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt|woff|woff2|ttf|svg)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
Para Ubuntu 24.04 (PHP 8.3): Reemplaza php8.4-fpm.sock por php8.3-fpm.sock.
Activar el virtual host
sudo ln -s /etc/nginx/sites-available/monsite.com /etc/nginx/sites-enabled/
Desactivar el sitio predeterminado (opcional)
sudo rm /etc/nginx/sites-enabled/default
Probar y recargar
sudo nginx -t
sudo systemctl reload nginx
🔒 Paso 7: Instalar un certificado SSL (Let's Encrypt)
Instalar Certbot
sudo apt install certbot python3-certbot-nginx -y
Obtener un certificado SSL
sudo certbot --nginx -d monsite.com -d www.monsite.com
Sigue las instrucciones:
- Ingresa tu dirección de correo electrónico
- Acepta los términos
- Elige redirigir de HTTP a HTTPS (recomendado)
Verificar la renovación automática
sudo certbot renew --dry-run
⚡ Paso 8: Optimizar PHP-FPM
Configuración del pool PHP-FPM
Debian 13:
sudo nano /etc/php/8.4/fpm/pool.d/www.conf
Ubuntu 24.04:
sudo nano /etc/php/8.3/fpm/pool.d/www.conf
Parámetros recomendados según la RAM
VPS 1-2 Go RAM:
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500
VPS 4 Go RAM:
pm = dynamic
pm.max_children = 25
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 1000
VPS 8+ Go RAM:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 2000
Explicación de los parámetros
| Parámetro | Descripción |
|---|---|
pm | Modo de gestión de procesos (estático, dinámico, por demanda) |
pm.max_children | Número máximo de procesos hijos |
pm.start_servers | Procesos al inicio |
pm.min_spare_servers | Mínimo de procesos inactivos |
pm.max_spare_servers | Máximo de procesos inactivos |
pm.max_requests | Requerimientos antes de reciclar el proceso |
Optimizar php.ini
Debian 13:
sudo nano /etc/php/8.4/fpm/php.ini
Ubuntu 24.04:
sudo nano /etc/php/8.3/fpm/php.ini
Parámetros recomendados:
; Memoria
memory_limit = 256M
; Subida
upload_max_filesize = 64M
post_max_size = 64M
; Ejecución
max_execution_time = 300
max_input_time = 300
max_input_vars = 3000
; Zona horaria
date.timezone = Europe/Paris
; OPcache (mejora el rendimiento)
opcache.enable = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 2
opcache.validate_timestamps = 1
; Seguridad
expose_php = Off
Reiniciar PHP-FPM
Debian 13:
sudo systemctl restart php8.4-fpm
Ubuntu 24.04:
sudo systemctl restart php8.3-fpm
⚡ Paso 9: Optimizar Nginx
Configuración principal
sudo nano /etc/nginx/nginx.conf
Configuración optimizada:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
# Parámetros básicos
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;
# Tamaño de los buffers
client_max_body_size 64M;
client_body_buffer_size 128k;
# Tipos MIME
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Logging
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# Compresión Gzip
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml application/json application/javascript
application/rss+xml application/atom+xml image/svg+xml;
# Includes
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Reiniciar Nginx
sudo nginx -t
sudo systemctl restart nginx
🛡️ Paso 10: Asegurar la instalación
Headers de seguridad
Agrega en tu bloque de servidor la configuración:
# Headers de seguridad
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Limitar las solicitudes (rate limiting)
En /etc/nginx/nginx.conf, sección http :
# Zonas de limitación
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
En su bloque de servidor :
location / {
limit_req zone=one burst=20 nodelay;
limit_conn addr 10;
}
📁 Estructura de archivos
Nginx
| Ruta | Descripción |
|---|---|
/etc/nginx/nginx.conf | Configuración principal |
/etc/nginx/sites-available/ | Configuraciones disponibles |
/etc/nginx/sites-enabled/ | Configuraciones activas (enlaces simbólicos) |
/etc/nginx/snippets/ | Fragmentos de configuración |
/var/log/nginx/ | Registros de acceso y error |
PHP-FPM
| Ruta (Debian 13) | Ruta (Ubuntu 24.04) | Descripción |
|---|---|---|
/etc/php/8.4/fpm/php.ini | /etc/php/8.3/fpm/php.ini | Configuración PHP |
/etc/php/8.4/fpm/pool.d/www.conf | /etc/php/8.3/fpm/pool.d/www.conf | Configuración del pool |
/run/php/php8.4-fpm.sock | /run/php/php8.3-fpm.sock | Socket FPM |
Sitios web
| Ruta | Descripción |
|---|---|
/var/www/html/ | Sitio por defecto |
/var/www/monsite.com/html/ | Raíz de un sitio personalizado |
🔧 Comandos útiles
Gestión de servicios
# Nginx
sudo systemctl start|stop|restart|reload|status nginx
# PHP-FPM (Debian 13)
sudo systemctl start|stop|restart|status php8.4-fpm
# PHP-FPM (Ubuntu 24.04)
sudo systemctl start|stop|restart|status php8.3-fpm
Pruebas y diagnóstico
# Probar la configuración de Nginx
sudo nginx -t
# Probar la configuración de PHP-FPM (Debian 13)
sudo php-fpm8.4 -t
# Probar la configuración de PHP-FPM (Ubuntu 24.04)
sudo php-fpm8.3 -t
# Ver los procesos de PHP-FPM
ps aux | grep php-fpm
# Ver las conexiones activas
ss -tlnp | grep -E 'nginx|php'
# Registros en tiempo real
sudo tail -f /var/log/nginx/error.log
Gestión de sitios
# Activar un sitio
sudo ln -s /etc/nginx/sites-available/monsite.com /etc/nginx/sites-enabled/
# Desactivar un sitio
sudo rm /etc/nginx/sites-enabled/monsite.com
# Listar los sitios activos
ls -la /etc/nginx/sites-enabled/
🔍 Solución de problemas
"502 Bad Gateway"
Causas : PHP-FPM no funciona o socket incorrecto
Soluciones :
# Verificar PHP-FPM (ajustar la versión)
sudo systemctl status php8.4-fpm
# Verificar el socket
ls -la /run/php/
# Reiniciar PHP-FPM
sudo systemctl restart php8.4-fpm
"403 Forbidden"
Causas : Permisos incorrectos
Soluciones :
# Corregir los permisos
sudo chown -R www-data:www-data /var/www/monsite.com
sudo chmod -R 755 /var/www/monsite.com
"404 Not Found" para archivos PHP
Causas : Configuración incorrecta de PHP-FPM
Verificaciones :
- El archivo existe
- La directiva
rootes correcta en Nginx - El bloque
location ~ \.php$está presente - El socket corresponde a la versión de PHP instalada
Página en blanco (PHP no se ejecuta)
Causas : PHP-FPM no conectado a Nginx
Soluciones :
# Verificar la versión del socket
ls /run/php/
# Comparar con la configuración de Nginx
grep fastcgi_pass /etc/nginx/sites-enabled/*
📋 Resumen rápido
Instalación completa Debian 13
# Actualizar
sudo apt update && sudo apt upgrade -y
# Nginx
sudo apt install nginx -y
# PHP-FPM 8.4
sudo apt install php8.4-fpm php8.4-cli php8.4-common php8.4-mysql \
php8.4-zip php8.4-gd php8.4-mbstring php8.4-curl php8.4-xml \
php8.4-bcmath php8.4-intl php8.4-opcache -y
# Cortafuegos
sudo ufw allow 'Nginx Full'
# SSL
sudo apt install certbot python3-certbot-nginx -y
Instalación completa Ubuntu 24.04
# Actualizar
sudo apt update && sudo apt upgrade -y
# Nginx
sudo apt install nginx -y
# PHP-FPM 8.3
sudo apt install php8.3-fpm php8.3-cli php8.3-common php8.3-mysql \
php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml \
php8.3-bcmath php8.3-intl php8.3-opcache -y
# Cortafuegos
sudo ufw allow 'Nginx Full'
# SSL
sudo apt install certbot python3-certbot-nginx -y
💡 Buenas prácticas
-
Siempre probar la configuración antes de recargar :
sudo nginx -t -
Usar hosts virtuales separados para cada sitio
-
Activar HTTPS con Let's Encrypt para todos los sitios
-
Vigilar los registros regularmente para detectar problemas
-
Hacer copias de seguridad de sus configuraciones antes de modificarlas
-
Optimizar PHP-FPM según los recursos de su VPS
-
Actualizar regularmente Nginx y PHP por seguridad
-
Eliminar los archivos de prueba (info.php) después de verificar

