Servidores Dedicados y VPS22 de enero de 2026 30 vistas

Cómo instalar Nginx y PHP-FPM en un VPS

Cómo instalar Nginx y PHP-FPM en un VPS

Implementación de una Pila Web de Alto Rendimiento: Nginx & PHP 8.2 FPM

Esta guía le ayudará a instalar un entorno de servidor robusto y seguro en un VPS, ideal para alojar frameworks modernos como Laravel, Symfony o CMS como WordPress.

🎯 Objetivos de la configuración

  • Servidor Web: Nginx (alto rendimiento para conexiones simultáneas).
  • Motor PHP: PHP 8.2 a través de FPM (Administrador de Procesos FastCGI).
  • Seguridad: HTTPS a través de Let's Encrypt, firewall UFW y protección contra ataques de fuerza bruta.
  • Optimización: Caché estático y gestión adecuada de permisos de acceso.

📋 Requisitos previos

  • Un servidor con Debian 12 o Ubuntu 22.04+.
  • Acceso SSH con privilegios sudo.
  • Un nombre de dominio cuyo registro "A" apunte a la IP de su servidor.

Etapa 1: Preparación e instalación de Nginx

Comience actualizando la lista de paquetes e instalando el servidor web.

# Actualizar el sistema
sudo apt update && sudo apt upgrade -y

# Instalar y activar Nginx
sudo apt install -y nginx
sudo systemctl enable --now nginx

Configuración del Firewall (UFW): Permita el tráfico web para que su sitio sea accesible.

sudo ufw allow "Nginx Full"

Etapa 2: Instalación y optimización de PHP 8.2

Instalaremos PHP 8.2 con las extensiones esenciales para la mayoría de las aplicaciones modernas.

# Instalación de PHP-FPM y módulos comunes
sudo apt install -y php8.2-fpm php8.2-cli php8.2-mysql php8.2-curl \
  php8.2-xml php8.2-gd php8.2-zip php8.2-mbstring php8.2-intl

🔒 Seguridad de PHP

Por defecto, PHP puede intentar ejecutar el archivo más cercano si no encuentra el archivo exacto solicitado. Desactivemos este comportamiento arriesgado:

# Desactivar cgi.fix_pathinfo
sudo sed -i 's/^\s*;*\s*cgi.fix_pathinfo\s*=.*/cgi.fix_pathinfo=0/' /etc/php/8.2/fpm/php.ini
sudo systemctl restart php8.2-fpm

Etapa 3: Estructura de archivos y permisos

Crearemos un directorio dedicado a su sitio y aplicaremos permisos restrictivos pero funcionales. Reemplace mon-domaine.com con su dominio real.

# Crear la estructura de directorios
sudo mkdir -p /var/www/mon-domaine.com/public

# Asignar propiedad al usuario web (www-data)
sudo chown -R www-data:www-data /var/www/mon-domaine.com

# Asegurar los permisos (Directorios en 750, Archivos en 640)
sudo find /var/www/mon-domaine.com -type d -exec chmod 750 {} \;
sudo find /var/www/mon-domaine.com -type f -exec chmod 640 {} \;

Etapa 4: Configuración del Virtual Host Nginx

Cree un archivo de configuración limpio para indicar a Nginx cómo manejar las solicitudes a su dominio.

sudo nano /etc/nginx/sites-available/mon-domaine.com

Copie este bloque de configuración:

server {
    listen 80;
    server_name mon-domaine.com www.mon-domaine.com;
    root /var/www/mon-domaine.com/public;
    index index.php index.html;

    # Manejo de URLs limpias (Laravel/Symfony)
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Ejecución de archivos PHP
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    # Optimización de caché para archivos estáticos
    location ~* \.(?:css|js|jpg|jpeg|gif|png|svg|ico|webp)$ {
        expires 7d;
        access_log off;
        add_header Cache-Control "public";
    }

    # Prohibir el acceso a archivos ocultos (.env, .git, etc.)
    location ~ /\. {
        deny all;
    }
}

Activación del sitio:

sudo ln -s /etc/nginx/sites-available/mon-domaine.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Etapa 5: Seguridad HTTPS (Certbot)

La migración a HTTPS es esencial hoy en día. Let's Encrypt permite automatizarlo de forma gratuita.

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d mon-domaine.com -d www.mon-domaine.com

Etapa 6: Mantenimiento y Seguridad avanzada

🛡️ Protección contra ataques

Instale Fail2ban para bloquear automáticamente las IP que intenten forzar el acceso SSH o web.

sudo apt install -y fail2ban

🔍 Solución rápida de problemas (Troubleshooting)

SíntomaCausa probableAcción
Error 502 Bad GatewayPHP-FPM está detenido o el socket es incorrecto.sudo systemctl status php8.2-fpm
Error 403 ForbiddenPermisos incorrectos en los directorios o falta de índice.Verificar chown y el directorio /public
Página PHP descargadaFalta el bloque location ~ \.php$.Verificar la configuración de Nginx y recargar.

💡 Variantes (Distribuciones RHEL / Rocky Linux)

Si está en una base RedHat, use dnf. El socket PHP generalmente se encuentra aquí: fastcgi_pass unix:/run/php-fpm/www.sock;