Instalación y Configuración de Nginx en Linux: Guía Completa

Introducción

Nginx (pronunciado "engine-x") es un servidor web de alto rendimiento de código abierto, servidor proxy inverso y balanceador de carga. Originalmente creado por Igor Sysoev en 2004 para resolver el problema C10K (manejar 10,000 conexiones concurrentes), Nginx se ha convertido en uno de los servidores web más populares del mundo, alimentando algunos de los sitios web más grandes y con mayor tráfico en internet.

A diferencia de los servidores web tradicionales que usan un modelo de proceso-por-solicitud o hilo-por-solicitud, Nginx usa una arquitectura asíncrona basada en eventos. Este diseño le permite manejar miles de conexiones concurrentes con una huella de memoria mínima y un rendimiento excepcional. Nginx sobresale en servir contenido estático, actuar como proxy inverso, balanceo de carga, caché y manejar terminación SSL/TLS.

Esta guía completa cubre todo lo que necesitas saber sobre instalar, configurar, optimizar y asegurar Nginx en varias distribuciones de Linux. Ya sea que estés configurando un sitio web estático simple, una arquitectura compleja de microservicios o una aplicación de alto tráfico, esta guía proporciona la base que necesitas para un despliegue exitoso de Nginx.

Requisitos Previos

Antes de instalar Nginx, asegúrate de tener:

  • Un servidor Linux ejecutando Ubuntu 20.04/22.04/24.04, Debian 10/11/12, CentOS 7/8, Rocky Linux 8/9 o AlmaLinux 8/9
  • Acceso root o una cuenta de usuario con privilegios sudo
  • Una conexión a internet estable para descargar paquetes
  • Familiaridad básica con la línea de comandos de Linux
  • Acceso al firewall (puertos 80 para HTTP y 443 para HTTPS)
  • Al menos 512 MB de RAM (se recomienda 1 GB+ para producción)
  • Mínimo 500 MB de espacio libre en disco
  • Un nombre de dominio registrado (opcional, pero recomendado para producción)
  • Comprensión básica de la configuración DNS
  • Conocimiento de editores de texto (nano, vim u otro)

Instalación de Nginx en Ubuntu y Debian

Instalar Nginx en sistemas basados en Debian es sencillo usando el gestor de paquetes APT.

Actualizar Repositorio de Paquetes

Comienza actualizando tus listas de paquetes:

sudo apt update
sudo apt upgrade -y

Instalar Nginx

Instala Nginx desde el repositorio oficial:

sudo apt install nginx -y

Este comando instala Nginx junto con todas las dependencias necesarias y crea automáticamente el usuario y grupo nginx.

Instalar desde el Repositorio Oficial de Nginx (Opcional)

Para la última versión estable o mainline, agrega el repositorio oficial de Nginx:

# Instalar prerequisitos
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring -y

# Importar clave de firma de Nginx
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

# Agregar repositorio para versión estable
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

# Actualizar e instalar
sudo apt update
sudo apt install nginx -y

Verificar Instalación

Verifica la versión instalada:

nginx -v

Salida esperada:

nginx version: nginx/1.24.0

Iniciar y Habilitar Nginx

Inicia el servicio Nginx y habilítalo para que se lance al iniciar el sistema:

sudo systemctl start nginx
sudo systemctl enable nginx

Verificar Estado del Servicio

Verifica que Nginx esté en ejecución:

sudo systemctl status nginx

Deberías ver "active (running)" en la salida.

Instalación de Nginx en CentOS, Rocky Linux y AlmaLinux

Instalar Nginx en distribuciones basadas en Red Hat sigue un proceso similar:

Actualizar Repositorio de Paquetes

Actualiza los paquetes de tu sistema:

sudo yum update -y  # Para CentOS 7
# O
sudo dnf update -y  # Para CentOS 8, Rocky Linux, AlmaLinux

Instalar Nginx desde el Repositorio EPEL

Habilita primero el repositorio EPEL:

# CentOS 7
sudo yum install epel-release -y

# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install epel-release -y

Instala Nginx:

# CentOS 7
sudo yum install nginx -y

# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install nginx -y

Instalar desde el Repositorio Oficial de Nginx (Recomendado)

Para la última versión, usa el repositorio oficial de Nginx:

# Crear archivo de repositorio
sudo nano /etc/yum.repos.d/nginx.repo

Agrega el siguiente contenido:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Instala Nginx:

# CentOS 7
sudo yum install nginx -y

# CentOS 8, Rocky Linux, AlmaLinux
sudo dnf install nginx -y

Verificar Instalación

Verifica la versión:

nginx -v

Iniciar y Habilitar Nginx

Inicia y habilita el servicio:

sudo systemctl start nginx
sudo systemctl enable nginx

Verificar Estado del Servicio

Verifica que el servicio esté en ejecución:

sudo systemctl status nginx

Configuración del Firewall

Configura tu firewall para permitir tráfico web:

Ubuntu y Debian (UFW)

Si usas UFW:

# Permitir HTTP y HTTPS
sudo ufw allow 'Nginx Full'

# O permitir puertos específicos
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

# Habilitar UFW si no está ya habilitado
sudo ufw enable

# Verificar estado
sudo ufw status

Nginx proporciona tres perfiles de aplicación UFW:

  • Nginx HTTP - Solo puerto 80
  • Nginx HTTPS - Solo puerto 443
  • Nginx Full - Ambos puertos 80 y 443

CentOS, Rocky Linux y AlmaLinux (firewalld)

Si usas firewalld:

# Permitir servicios HTTP y HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# O permitir puertos específicos
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp

# Recargar firewall
sudo firewall-cmd --reload

# Verificar reglas
sudo firewall-cmd --list-all

Probando la Instalación de Nginx

Verifica que Nginx esté sirviendo contenido:

Probar desde Línea de Comandos

Usa curl para probar localmente:

curl localhost

Deberías ver salida HTML de la página de bienvenida predeterminada de Nginx.

Probar desde Navegador Web

Abre un navegador web y navega a:

  • http://your_server_ip
  • http://your_domain.com (si el DNS está configurado)

Deberías ver la página predeterminada "Welcome to nginx!".

Verificar Proceso de Nginx

Verifica que los procesos de Nginx estén en ejecución:

ps aux | grep nginx

Deberías ver un proceso maestro y varios procesos trabajadores.

Estructura de Directorios de Nginx

Comprender la organización de archivos de Nginx es esencial:

Estructura de Ubuntu y Debian

/etc/nginx/
├── nginx.conf              # Archivo de configuración principal
├── sites-available/        # Configuraciones de bloques de servidor disponibles
├── sites-enabled/          # Bloques de servidor habilitados (enlaces simbólicos)
├── conf.d/                 # Archivos de configuración adicionales
├── snippets/               # Fragmentos de configuración
└── modules-enabled/        # Módulos habilitados

/var/www/html/              # Raíz de documentos predeterminada

/var/log/nginx/             # Archivos de registro
├── access.log              # Registros de acceso
└── error.log               # Registros de errores

/usr/share/nginx/html/      # Raíz web predeterminada (algunas instalaciones)

Estructura de CentOS, Rocky Linux y AlmaLinux

/etc/nginx/
├── nginx.conf              # Archivo de configuración principal
├── conf.d/                 # Archivos de configuración adicionales (*.conf)
└── default.d/              # Configuración del servidor predeterminado

/usr/share/nginx/html/      # Raíz de documentos predeterminada

/var/log/nginx/             # Archivos de registro
├── access.log              # Registros de acceso
└── error.log               # Registros de errores

Conceptos Básicos de Configuración de Nginx

Exploremos la sintaxis y estructura de configuración de Nginx:

Archivo de Configuración Principal

El archivo de configuración principal es /etc/nginx/nginx.conf. Aquí hay una estructura típica:

# Usuario y procesos trabajadores
user nginx;
worker_processes auto;

# Ubicación del registro de errores
error_log /var/log/nginx/error.log warn;

# Archivo PID
pid /var/run/nginx.pid;

# Bloque de eventos
events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

# Bloque HTTP
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Formato de registro
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    # Configuración de rendimiento
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # Compresión Gzip
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript
               application/json application/javascript application/xml+rss
               application/rss+xml font/truetype font/opentype
               application/vnd.ms-fontobject image/svg+xml;

    # Incluir bloques de servidor
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;  # Ubuntu/Debian
}

Entendiendo los Contextos de Configuración

La configuración de Nginx usa una estructura jerárquica con contextos:

  1. Contexto principal - Configuración global
  2. Contexto de eventos - Procesamiento de conexiones
  3. Contexto HTTP - Configuración específica de HTTP
  4. Contexto de servidor - Definiciones de host virtuales
  5. Contexto de ubicación - Configuración específica de URI

Directivas Básicas Explicadas

# worker_processes: Número de procesos trabajadores (auto = núcleos de CPU)
worker_processes auto;

# worker_connections: Conexiones máximas por trabajador
worker_connections 1024;

# sendfile: Transferencia eficiente de archivos
sendfile on;

# tcp_nopush: Enviar encabezados en un paquete
tcp_nopush on;

# tcp_nodelay: Deshabilitar algoritmo de Nagle para conexiones en tiempo real
tcp_nodelay on;

# keepalive_timeout: Tiempo de espera de keep-alive de conexión del cliente
keepalive_timeout 65;

# client_max_body_size: Tamaño máximo de carga
client_max_body_size 20M;

Creando un Bloque de Servidor (Host Virtual)

Los bloques de servidor permiten alojar múltiples sitios web en un servidor:

Bloque de Servidor para Ubuntu y Debian

Crea una nueva configuración de bloque de servidor:

sudo nano /etc/nginx/sites-available/example.com

Agrega la siguiente configuración:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm index.nginx-debian.html;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    # Denegar acceso a archivos ocultos
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Almacenar en caché archivos estáticos
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Crea la raíz de documentos:

sudo mkdir -p /var/www/example.com/html

Crea un archivo de índice de prueba:

sudo nano /var/www/example.com/html/index.html

Agrega:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bienvenido a Example.com</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            text-align: center;
        }
        h1 { color: #009639; }
    </style>
</head>
<body>
    <h1>¡Éxito! ¡Nginx está funcionando!</h1>
    <p>Este es el host virtual example.com.</p>
</body>
</html>

Establece los permisos apropiados:

sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com

Habilita el bloque de servidor creando un enlace simbólico:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Prueba la configuración:

sudo nginx -t

Recarga Nginx:

sudo systemctl reload nginx

Bloque de Servidor para CentOS, Rocky Linux y AlmaLinux

Crea una configuración de bloque de servidor:

sudo nano /etc/nginx/conf.d/example.com.conf

Agrega:

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /usr/share/nginx/example.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Crea directorios y archivos:

sudo mkdir -p /usr/share/nginx/example.com/html
sudo nano /usr/share/nginx/example.com/html/index.html

Establece permisos:

sudo chown -R nginx:nginx /usr/share/nginx/example.com
sudo chmod -R 755 /usr/share/nginx/example.com

En sistemas habilitados con SELinux:

sudo chcon -R -t httpd_sys_content_t /usr/share/nginx/example.com/

Prueba y recarga:

sudo nginx -t
sudo systemctl reload nginx

Configuraciones Avanzadas de Bloques de Ubicación

Los bloques de ubicación definen cómo Nginx maneja diferentes URIs:

Coincidencia Exacta

# Coincidencia exacta - máxima prioridad
location = /favicon.ico {
    access_log off;
    log_not_found off;
}

Coincidencia de Prefijo

# Coincidencia de prefijo
location /images/ {
    root /var/www/example.com;
    autoindex on;
}

Coincidencia de Expresión Regular

# Coincidencia de regex sensible a mayúsculas
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
}

# Coincidencia de regex insensible a mayúsculas
location ~* \.(jpg|jpeg|png|gif|ico)$ {
    expires 30d;
}

Coincidencia de Prefijo Preferencial

# Coincidencia de prefijo preferencial - mayor prioridad que regex
location ^~ /static/ {
    root /var/www;
}

Orden de Prioridad de Ubicaciones

  1. Coincidencia exacta =
  2. Coincidencia de prefijo preferencial ^~
  3. Coincidencia de expresión regular ~ o ~*
  4. Coincidencia de prefijo (sin modificador)

Optimización de Rendimiento

Optimiza Nginx para máximo rendimiento:

Configuración de Procesos Trabajadores

# Establecer al número de núcleos de CPU
worker_processes auto;

# Vincular procesos trabajadores a núcleos de CPU
worker_cpu_affinity auto;

# Archivos abiertos máximos por trabajador
worker_rlimit_nofile 65535;

Manejo de Conexiones

events {
    # Conexiones máximas por trabajador
    worker_connections 4096;

    # Usar método de conexión eficiente
    use epoll;  # Linux
    # use kqueue;  # FreeBSD/macOS

    # Aceptar múltiples conexiones a la vez
    multi_accept on;
}

Ajuste de Tamaño de Búfer

http {
    # Tamaño de búfer del cuerpo del cliente
    client_body_buffer_size 128k;

    # Tamaño de búfer del encabezado del cliente
    client_header_buffer_size 1k;
    large_client_header_buffers 4 16k;

    # Tiempo de espera del cuerpo del cliente
    client_body_timeout 12;
    client_header_timeout 12;

    # Tiempo de espera de envío
    send_timeout 10;
}

Optimización de Keepalive

http {
    # Tiempo de espera de keepalive
    keepalive_timeout 65;

    # Solicitudes máximas por conexión
    keepalive_requests 100;
}

Configuración de Compresión

http {
    # Habilitar compresión gzip
    gzip on;

    # Nivel de compresión (1-9)
    gzip_comp_level 6;

    # Tamaño mínimo de archivo para comprimir
    gzip_min_length 1000;

    # Comprimir solicitudes proxy
    gzip_proxied any;

    # Tipos de archivo para comprimir
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/svg+xml;

    # Agregar encabezado Vary
    gzip_vary on;

    # Deshabilitar para IE antiguo
    gzip_disable "msie6";
}

Almacenamiento en Caché de Archivos

http {
    # Caché de archivos abiertos
    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}

Caché FastCGI (para PHP)

http {
    # Ruta de caché FastCGI
    fastcgi_cache_path /var/cache/nginx/fastcgi
                       levels=1:2
                       keys_zone=FASTCGICACHE:100m
                       inactive=60m
                       max_size=1g;

    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
}

server {
    location ~ \.php$ {
        fastcgi_cache FASTCGICACHE;
        fastcgi_cache_valid 200 60m;
        add_header X-FastCGI-Cache $upstream_cache_status;
    }
}

Endurecimiento de Seguridad

Implementa las mejores prácticas de seguridad:

Ocultar Versión de Nginx

http {
    # Ocultar número de versión
    server_tokens off;
}

Encabezados de Seguridad

server {
    # Prevenir clickjacking
    add_header X-Frame-Options "SAMEORIGIN" always;

    # Prevenir detección de tipo MIME
    add_header X-Content-Type-Options "nosniff" always;

    # Habilitar protección XSS
    add_header X-XSS-Protection "1; mode=block" always;

    # Política de referrer
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    # Política de Seguridad de Contenido
    add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always;

    # HSTS (si usas HTTPS)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}

Limitar Métodos de Solicitud

server {
    # Permitir solo GET, HEAD, POST
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 405;
    }
}

Limitación de Tasa

http {
    # Definir zona de límite de tasa
    limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

    server {
        location / {
            # Aplicar límite de tasa
            limit_req zone=one burst=20 nodelay;
        }
    }
}

Limitación de Conexiones

http {
    # Limitar conexiones por IP
    limit_conn_zone $binary_remote_addr zone=addr:10m;

    server {
        location /download/ {
            limit_conn addr 5;
        }
    }
}

Restringir Acceso por IP

location /admin {
    allow 192.168.1.100;
    allow 10.0.0.0/24;
    deny all;
}

Denegar Acceso a Archivos Ocultos

location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

Autenticación Básica

# Instalar utilidad htpasswd
sudo apt install apache2-utils  # Ubuntu/Debian
sudo yum install httpd-tools    # CentOS/Rocky/AlmaLinux

# Crear archivo de contraseña
sudo htpasswd -c /etc/nginx/.htpasswd username

Configurar Nginx:

location /admin {
    auth_basic "Área Restringida";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

Deshabilitar Métodos HTTP Peligrosos

location / {
    limit_except GET HEAD POST {
        deny all;
    }
}

Configuración SSL/TLS

Configura HTTPS para conexiones seguras:

Generar Certificado Auto-firmado (Solo para Pruebas)

sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/nginx/ssl/nginx-selfsigned.key \
    -out /etc/nginx/ssl/nginx-selfsigned.crt

Bloque de Servidor HTTPS

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name example.com www.example.com;

    # Certificados SSL
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;

    # Protocolos y cifrados SSL
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # Caché de sesión SSL
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/ssl/chain.crt;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    # Root e index
    root /var/www/example.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

# Redirigir HTTP a HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

Gestión de Registros

Configura el registro efectivo:

Formato de Registro Personalizado

http {
    log_format custom '$remote_addr - $remote_user [$time_local] '
                     '"$request" $status $body_bytes_sent '
                     '"$http_referer" "$http_user_agent" '
                     '$request_time $upstream_response_time';

    access_log /var/log/nginx/access.log custom;
}

Registro Condicional

map $status $loggable {
    ~^[23] 0;
    default 1;
}

server {
    access_log /var/log/nginx/access.log combined if=$loggable;
}

Deshabilitar Registro para Ubicaciones Específicas

location = /favicon.ico {
    access_log off;
    log_not_found off;
}

location = /robots.txt {
    access_log off;
    log_not_found off;
}

Ver Registros en Tiempo Real

# Registros de acceso
sudo tail -f /var/log/nginx/access.log

# Registros de errores
sudo tail -f /var/log/nginx/error.log

# Ambos registros
sudo tail -f /var/log/nginx/*.log

Verificación y Pruebas

Verifica tu configuración de Nginx:

Probar Sintaxis de Configuración

sudo nginx -t

Salida esperada:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Recargar Configuración

sudo systemctl reload nginx
# o
sudo nginx -s reload

Reiniciar Nginx

sudo systemctl restart nginx

Verificar Estado de Nginx

sudo systemctl status nginx

Ver Conexiones Activas

# Requiere módulo stub_status
curl http://localhost/nginx_status

Configurar stub_status:

server {
    location /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
}

Solución de Problemas Comunes

Nginx No Inicia

Verifica registros de errores:

sudo journalctl -u nginx -n 50 --no-pager
sudo tail -f /var/log/nginx/error.log

Causas comunes:

  • Errores de sintaxis en la configuración
  • Puerto ya en uso
  • Problemas de permisos
  • Directorios faltantes

Errores de Sintaxis de Configuración

Siempre prueba antes de recargar:

sudo nginx -t

Revisa el mensaje de error específico y el número de línea.

Puerto Ya en Uso

Encuentra qué está usando el puerto 80:

sudo ss -tulpn | grep :80
sudo lsof -i :80

Errores de Permiso Denegado

Verifica la propiedad de archivos:

ls -la /var/www/example.com/

Corrige permisos:

sudo chown -R www-data:www-data /var/www/example.com  # Ubuntu/Debian
sudo chown -R nginx:nginx /usr/share/nginx/example.com  # CentOS/Rocky

En sistemas SELinux:

# Verificar estado de SELinux
getenforce

# Establecer contexto correcto
sudo chcon -R -t httpd_sys_content_t /usr/share/nginx/example.com/

# Establecer permanentemente
sudo semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/example.com(/.*)?"
sudo restorecon -Rv /usr/share/nginx/example.com/

502 Bad Gateway

Causas comunes:

  • PHP-FPM no está en ejecución
  • Ruta de socket incorrecta
  • Recursos insuficientes

Verificar PHP-FPM:

sudo systemctl status php8.1-fpm  # Ubuntu/Debian
sudo systemctl status php-fpm     # CentOS/Rocky

413 Request Entity Too Large

Aumentar límite de tamaño de carga:

http {
    client_max_body_size 20M;
}

Rendimiento Lento

Verificar procesos trabajadores:

ps aux | grep nginx

Optimizar worker_processes y worker_connections:

worker_processes auto;

events {
    worker_connections 4096;
}

Mejores Prácticas

Sigue estas mejores prácticas de Nginx:

Actualizaciones Regulares

Mantén Nginx actualizado:

# Ubuntu/Debian
sudo apt update
sudo apt upgrade nginx

# CentOS/Rocky/AlmaLinux
sudo dnf update nginx

Respaldos de Configuración

Respalda antes de hacer cambios:

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup-$(date +%F)
sudo tar -czf nginx-config-backup-$(date +%F).tar.gz /etc/nginx/

Usar Directivas Include

Organiza configuraciones:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Archivos de Registro Separados por Sitio

server {
    access_log /var/log/nginx/example.com-access.log;
    error_log /var/log/nginx/example.com-error.log;
}

Monitorear Recursos

# Verificar uso de memoria
free -h

# Verificar uso de CPU
top

# Verificar espacio en disco
df -h

# Procesos de Nginx
ps aux | grep nginx

Usar Fragmentos de Configuración

Crea fragmentos reutilizables:

sudo nano /etc/nginx/snippets/ssl-params.conf

Agrega:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

Incluir en bloques de servidor:

server {
    listen 443 ssl http2;
    include snippets/ssl-params.conf;
    # ...
}

Conclusión

Nginx es un servidor web potente, eficiente y flexible que sobresale en entornos modernos de alojamiento web. Esta guía completa ha cubierto instalación, configuración, optimización y endurecimiento de seguridad en múltiples distribuciones de Linux.

Puntos clave:

  • La arquitectura basada en eventos de Nginx proporciona rendimiento superior para conexiones concurrentes
  • La configuración adecuada de bloques de servidor permite alojamiento multi-sitio eficiente
  • El ajuste de rendimiento a través de procesos trabajadores y buffering impacta significativamente la eficiencia
  • El endurecimiento de seguridad con encabezados, limitación de tasa y SSL/TLS es esencial para producción
  • El monitoreo regular, actualizaciones y respaldos mantienen la salud del servidor

La versatilidad de Nginx se extiende más allá del servicio web básico a proxy inverso, balanceo de carga, caché y funcionalidad de gateway API. Continúa explorando características avanzadas como soporte HTTP/2, QUIC/HTTP/3, estrategias de caché avanzadas e integración con stacks de aplicaciones modernas.

Para despliegues en producción, siempre implementa HTTPS, configura registro y monitoreo adecuados, establece respaldos automatizados y sigue las mejores prácticas de seguridad. La comunidad de Nginx y la documentación proporcionan excelentes recursos para configuraciones avanzadas y solución de problemas.