Despliegue y Configuración de Nginx en Sistemas Linux con APT

Instalación de Nginx en Distribuciones Linux Basadas en APT

Nginx es un servidor web de alto rendimiento y un proxy inverso que se ha convertido en una opción popular para el despliegue de aplicaciones modernas. Esta guía detalla el proceso de instalación y configuración básica de Nginx en sistemas operativos Linux que utilizan el gestor de paquetes APT, como Debian, Ubuntu o Kylin OS.

Paso 1: Actualizar el Índice de Paquetes

Antes de instalar cualquier software nuevo, es una buena práctica actualizar la lista de paquetes disponibles en su sistema para asegurar que está obteniendo las versiones más recientes y corregir posibles dependencias.

sudo apt update

Paso 2: Instalar Nginx

Una vez que el sistema esté actualizado, proceda con la instalación de Nginx. El comando descargará e instalará Nginx y todas sus dependencias.

sudo apt install nginx

Paso 3: Verificar la Instalación

Después de la instalación, puede verificar que Nginx se ha instalado correctamente y conocer su versión ejecutando el siguiente comando:

nginx -v

Para confirmar que el servicio Nginx se está ejecutando, utilice systemctl:

systemctl status nginx

Debería ver un estado que indique "active (running)".

Paso 4: Gestión del Servicio Nginx

Nginx se ejecuta como un servicio en el sistema. Puede controlarlo utilizando los siguientes comandos de systemctl:

  • Iniciar Nginx:
sudo systemctl start nginx

  1. Habilitar Nginx al inicio del sistema: (Recomendado para que Nginx arranque automáticamente después de un reinicio)
sudo systemctl enable nginx

  1. Reiniciar Nginx: (Detiene y vuelve a iniciar el servicio, útil para aplicar cambios importantes o resolver problemas)
sudo systemctl restart nginx

  1. Recargar Configuración de Nginx: (Aplica cambios a los archivos de configuración sin detener el servicio, ideal para cambios menores sin interrupción)
sudo systemctl reload nginx

Alternativamente, también puede usar el comando específico de Nginx para recargar:

sudo nginx -s reload

  1. Detener Nginx:
sudo systemctl stop nginx

Paso 5: Acceso Inicial al Servidor Web

Una vez que Nginx está en funcionamiento, puede verificar su configuración predeterminada abriendo un navegador web y navegendo a la dirección IP de su servidor o a http://localhost/ si está accediendo desde la misma máquina. Debería ver la página de bienvenida predeterminada de Nginx.

Paso 6: Ubicaciones Clave de Archivos de Nginx

Es fundamental conocer las rutas de los archivos y directorios más importantes de Nginx:

  • /etc/nginx/: Directorio principal de configuración.
  • /etc/nginx/nginx.conf: Archivo de configuración global de Nginx.
  • /etc/nginx/conf.d/: Directorio para archivos de configuración de sitios individuales (incluidos por nginx.conf).
  • /var/www/html/: Directoiro predeterminado para el contenido web estático.
  • /usr/sbin/nginx: Binario principal de Nginx.
  • /var/log/nginx/: Directorio donde se almacenan los archivos de registro (access.log y error.log).

Paso 7: Modificación de la Configuración de Nginx

La configuración de Nginx se realiza principalmente editando los archivos en el directorio /etc/nginx/. El archivo /etc/nginx/nginx.conf es el archivo de configuración principal. Puede editarlo con un editor de texto como Vim:

sudo vim /etc/nginx/nginx.conf

Ejemplo de Configuración Avanzada

A continuación, se presenta un ejemplo de configuración que incluye la servidumbre de archivos estáticos para una aplicación frontend, la compresión Gzip, la configuración de un proxy inverso para una API backend y la habilitación de CORS. Este ejemplo asume que tiene una aplicación frontend en /opt/mi_app_frontend y un backend de API escuchando en un puerto local.

worker_processes auto; # Configura el número de procesos worker automáticamente

events {
    worker_connections 1024; # Número máximo de conexiones simultáneas por worker
}

http {
    include mime.types; # Incluye las definiciones de tipos MIME
    default_type application/octet-stream; # Tipo MIME predeterminado

    # Configuración de compresión Gzip para mejorar el rendimiento
    gzip on;
    gzip_min_length 1000; # Compresión mínima para archivos de 1KB
    gzip_buffers 4 16k; # Número y tamaño de los búferes de compresión
    gzip_comp_level 5; # Nivel de compresión (1-9, 5 es un buen equilibrio)
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml application/json;

    sendfile on; # Habilita el envío directo de archivos
    keepalive_timeout 65; # Tiempo de espera para conexiones persistentes

    client_max_body_size 20m; # Tamaño máximo permitido para el cuerpo de la solicitud

    # Bloque de servidor para la aplicación frontend
    server {
        listen 80; # Escucha en el puerto HTTP estándar
        server_name ejemplo.com www.ejemplo.com; # Nombre de dominio de su servidor

        location / {
            root /opt/mi_app_frontend; # Directorio raíz de los archivos de la aplicación
            index index.html index.htm; # Archivos de índice predeterminados
            try_files $uri $uri/ /index.html; # Para aplicaciones SPA (Single Page Applications)
        }

        # Proxy inverso para la API backend
        location /api/ {
            proxy_pass http://localhost:8080/; # La dirección de su API backend
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # Manejo de errores personalizados
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }

    # Bloque de servidor para una API backend directamente (con CORS)
    server {
        listen 8458; # Puerto alternativo para la API
        server_name api.ejemplo.com; # Dominio o IP para la API

        # Cabeceras CORS para permitir solicitudes desde otros orígenes
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;

        # Manejo de solicitudes OPTIONS para pre-vuelo de CORS
        if ($request_method = 'OPTIONS') {
            add_header 'Access-Control-Max-Age' 1728000;
            add_header 'Content-Type' 'text/plain charset=UTF-8';
            add_header 'Content-Length' 0;
            return 204;
        }

        location / {
            proxy_pass http://127.0.0.1:9291; # La dirección real del servicio API
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade"; # Para WebSockets
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

Configuración Modular con Directorios Incluidos

Para una mejor organización, especialmente cuando se gestionan múltiples sitios web o aplicaciones, Nginx permite incluir archivos de configuración adicionales. Es una práctica común crear un archivo .conf separado para cada sitio dentro del directorio /etc/nginx/conf.d/. El archivo nginx.conf principal ya incluye por defecto la línea include /etc/nginx/conf.d/*.conf; dentro del bloque http {}, lo que hace que Nginx cargue todas las configuraciones en ese directorio.

Para crear un nuevo archivo de configuración para un sitio:

sudo touch /etc/nginx/conf.d/mi_sitio_web.conf
sudo vim /etc/nginx/conf.d/mi_sitio_web.conf

A continuación, un ejemplo de contenido para /etc/nginx/conf.d/mi_sitio_web.conf:

server {
    listen 9898; # Puerto específico para este sitio
    server_name mi-aplicacion.local; # Dominio o nombre de host

    location / {
        root /var/www/mi-aplicacion; # Directorio donde reside su aplicación
        index index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    location /backend-api/ {
        proxy_pass http://localhost:3000/; # Proxy a un backend en el puerto 3000
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

Después de realizar cualquier cambio en los archivos de configuración, recuerde seimpre recargar Nginx para que los cambios surtan efecto:

sudo systemctl reload nginx

Etiquetas: Nginx linux apt WebServer ReverseProxy

Publicado el 7-17 11:18