Nginx
Nginx es un servidor web y proxy inverso de alto rendimiento. Es conocido por su eficiencia, escalabilidad y capacidad para manejar una gran cantidad de conexiones simultáneas.

Estructura y configuración
Los archivos que se crean dentro de /etc/nginx
son los siguientes directorios:

Directorio de Configuración Principal
El archivo principal de configuración se encuentra en
/etc/nginx/nginx.conf
. Este archivo contiene la configuración principal y desde aquí puedes modificar configuraciones globales./etc/nginx/sites-available
y/etc/nginx/sites-enabled
: Directorios utilizados para la gestión de sitios virtuales. Los archivos de configuración de sitios virtuales se encuentran ensites-available
. Para activar un sitio, se crea un enlace simbólico ensites-enabled
.
Configuración Básica del Servidor
Una de las características principales de nginx es que desde el archivo nginx.conf
, puedes definir servidores utilizando bloques server { }
. Esto se usa para definir la configuración para un servidor web específico o un "sitio virtual".
Cada bloque server
se utiliza para configurar cómo Nginx debe responder a las solicitudes entrantes para un determinado conjunto de criterios, como el nombre del servidor, el puerto o la dirección IP.
Esto seria un ejemplo:
server {
listen 80;
server_name ejemplo.com www.ejemplo.com;
location / {
root /ruta/a/tu/sitio;
index index.html;
}
}
El resultado será que al entrar en el dominio a través del puerto 80 se conectará al index.html
Registro y acceso
Como cualquier servidor web y, especialmente, los que tienen funciones de proxy tienen funciones de registro:
Los errores se registran en
/var/log/nginx/error.log
.Los registros de accesos se encuentran en
/var/log/nginx/access.log
.
Parámetros de conexión del servidor
Workers
Para aprovechar todos los cores de la máquina en la que estemos, es recomendable dejar la opción por defecto. El resultado será que se levanten tantos workers como cores tenga la cpu.
Si Nginx está realizando un trabajo intensivo de CPU, como SSL o gzipping, y tiene 2 o más CPU/núcleos, puede establecer worker_processes para que sea igual al número de CPU o núcleos.
Si está sirviendo muchos archivos estáticos y el tamaño total de los archivos es mayor que la memoria disponible, puede aumentar worker_processes para utilizar completamente el ancho de banda del disco.
La configuración de los "workers" se realiza en el archivo principal de configuración, comúnmente llamado nginx.conf
, añade para que vaya en función de todos los nucleos:
worker_processes auto;
Los worker processes con subrutinas que controlan el flujo de procesamiento del servidor:
Los worker processes de Nginx manejan la solicitud entrante.
Puede ir más allá de los núcleos disponibles si tiene acceso de E/S.
Respecto a los worker_connections:
Cada worker process puede abrir de forma predeterminada 512 conexiones.
Puede cambiar este límite con
worker_connections <NUM>;
Puede establecer el límite máximo con:
ulimit -n
por lo tanto podemos calcular que:
max_clients = worker processes * worker connections
Puertos
Dentro de un bloque server añade las siguientes líneas tal y como se ha visto en el ejemplo anterior:
listen 80 default_server;
#o bien:
listen [::]:80 default_server ipv6only=on;
Timeouts
Dependiendo del rol que tenga nginx en tu arquitectura ( como Proxy , como servidor de estáticos, etc…) habrá que tener en cuenta en qué bloque y qué valor de configuración tomamos.
Vamos a tomar como referencia este post, pero tened en cuenta que estos no son los únicos parámetros:
keepalive_timeout 10; (default 75)
keepalive_requests 1024; (default 100)
client_header_timeout 10; (default 60)
client_body_timeout 10; (default 60)
send_timeout 10; (default 60)
sendfile on; (default off)
tcp_nopush on; (default off)
tcp_nodelay on; (default on)
Logs
Dentro del archivo de configuración básica de nginx.conf
se añade:
http {
# Otras configuraciones de HTTP aquí...
# Default error log file
# (this is only used when you don't override error_log on a server{} level)
error_log logs/error.log warn;
# Format to use in log files
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# Default log file
# (this is only used when you don't override access_log on a server{} level)
access_log logs/access.log main;
# Resto de la configuración...
server {
# Configuraciones del servidor...
location / {
# Configuraciones de la ubicación...
}
}
}
Módulos
Nginx, como mejora de Apache, permite ampliar su funcionalidad por medio del uso de módulos. Algunos de los módulos más importantes que nos podemos encontrar son:
HTTP Referer. Filtra peticiones recibidas en función de la cabecera Referer.
HTTP Limit Zone. Limita el número de conexiones simultáneas desde un mismo cliente.
User ID. Proporciona cookies identificativas.
FLV. Permite reproducir vídeo en streaming.
Perl. Módulo que permite ejecutar Perl directamente dentro de Nginx.
WebDAV. Ofrece soporte para WebDAV.
Secure Link. Este módulo ofrece la posibilidad de proteger páginas mediante clave secreta.
XSLT. Funcionalidad que permite el post-procesamiento de páginas mediante XSLT
Bloques y condificación
Resumen de codigos de configuración de nginx con ejemplos:
Configurar el Puerto (listen
)
listen
)server {
# Protocolo HTTP estándar
listen 80;
# Protocolo HTTPS estándar
listen 443 ssl;
# Escuchar en IPv6 en el puerto 80
listen [::]:80;
# Escuchar solo en IPv6
listen [::]:80 ipv6only=on;
}
Configurar Nombre de Dominio (server_name
)
server_name
)server {
# Escuchar solicitudes de un dominio específico
server_name yourdomain.com;
# Escuchar múltiples dominios
server_name yourdomain.com www.yourdomain.com;
# Escuchar todos los subdominios
server_name *.yourdomain.com;
# Escuchar todos los dominios de nivel superior
server_name yourdomain.*;
# Escuchar cuando no se especifica un nombre de host (usa la IP del servidor)
server_name "";
}
Registro de Accesos (access_log
)
access_log
)server {
# Ruta relativa o absoluta del archivo de log
access_log /ruta/al/archivo.log;
# Activar o desactivar logging
access_log on;
}
Configuraciones Misceláneas (gzip
, client_max_body_size
)
gzip
, client_max_body_size
)server {
# Activar o desactivar compresión gzip
gzip on;
# Limitar el tamaño del cuerpo de la solicitud del cliente a 10MB
client_max_body_size 10M;
}
Redirecciones (return 301
)
return 301
)server {
listen 80;
server_name www.yourdomain.com;
# Redirigir a dominio sin 'www'
return 301 http://yourdomain.com$request_uri;
}
server {
listen 80;
server_name yourdomain.com;
location /redirect-url {
# Redirigir a otro dominio
return 301 http://otherdomain.com;
}
}
Servir Archivos Estáticos
server {
listen 80;
server_name yourdomain.com;
location / {
root /ruta/a/sitio-web;
}
}
Proxy Inverso (Reverse Proxy)
server {
listen 80;
server_name yourdomain.com;
location / {
# Redirigir tráfico a un servidor Node.js en el puerto 3000
proxy_pass http://0.0.0.0:3000;
}
}
Servir Archivos Estáticos con Modo Historia en HTML5
server {
listen 80;
server_name yourdomain.com;
root /ruta/a/sitio-web;
}
Configurar SSL
server {
listen 443 ssl;
server_name yourdomain.com;
location / {
try_files $uri $uri/ /index.html;
}
ssl on;
ssl_certificate /ruta/al/certificado.pem;
ssl_certificate_key /ruta/a/clave_privada.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /ruta/a/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
# Seguridad adicional
add_header Strict-Transport-Security "max-age=15768000";
}
Balanceo de Carga (upstream
)
upstream
)upstream node_js {
server 0.0.0.0:3000;
server 0.0.0.0:4000;
server 123.131.121.122;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://node_js;
}
}
Redirección Permanente de HTTP a HTTPS
server {
listen 80;
server_name yourdomain.com;
return 301 https://$host$request_uri;
}
Este documento es ahora más estructurado y fácil de leer. ¡Déjame saber si necesitas modificaciones! 🚀
Referencia:
Última actualización