Servidores Dedicados y VPS10 de diciembre de 2025 28 vistas

Instalar Nginx y PHP-FPM en un VPS Linux

Instalar Nginx y PHP-FPM en un VPS Linux

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:

  1. Ingresa tu dirección de correo electrónico
  2. Acepta los términos
  3. 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 :

  1. El archivo existe
  2. La directiva root es correcta en Nginx
  3. El bloque location ~ \.php$ está presente
  4. 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

  1. Siempre probar la configuración antes de recargar : sudo nginx -t

  2. Usar hosts virtuales separados para cada sitio

  3. Activar HTTPS con Let's Encrypt para todos los sitios

  4. Vigilar los registros regularmente para detectar problemas

  5. Hacer copias de seguridad de sus configuraciones antes de modificarlas

  6. Optimizar PHP-FPM según los recursos de su VPS

  7. Actualizar regularmente Nginx y PHP por seguridad

  8. Eliminar los archivos de prueba (info.php) después de verificar