# =============================================================================
# Nginx optimizado para Claude Conversation Logger
# Incluye compresión gzip, caché estático y optimizaciones de performance
# =============================================================================
# Configuración del servidor principal
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# Configuración de logs optimizada
access_log /var/log/nginx/access.log combined buffer=16k flush=1m;
error_log /var/log/nginx/error.log warn;
# Configuración de seguridad básica
server_tokens off;
add_header X-Frame-Options DENY 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;
# Configuración de timeouts optimizada
client_max_body_size 10M;
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 65;
send_timeout 10;
# Configuración de buffers optimizada
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
# =============================================================================
# COMPRESIÓN GZIP OPTIMIZADA
# =============================================================================
# Habilitar compresión gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_proxied any;
gzip_buffers 16 8k;
gzip_http_version 1.1;
# Tipos de archivo para comprimir
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
# =============================================================================
# CONFIGURACIÓN DE CACHÉ ESTÁTICO
# =============================================================================
# Caché para archivos estáticos (imágenes, CSS, JS)
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
# Logging reducido para archivos estáticos
access_log off;
# Configuración de CORS para assets
add_header Access-Control-Allow-Origin "*" always;
add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS" always;
add_header Access-Control-Allow-Headers "Range" always;
# Manejo de archivos no encontrados
try_files $uri $uri/ =404;
}
# Caché para archivos de Vue.js y librerías
location ~* ^/src/dashboard/assets/.*\.(js|css)$ {
expires 6M;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
access_log off;
# Cabeceras específicas para JavaScript
add_header Content-Type "application/javascript; charset=utf-8";
try_files $uri $uri/ =404;
}
# Caché para documentos HTML
location ~* \.(html|htm)$ {
expires 1h;
add_header Cache-Control "public, must-revalidate";
add_header Vary "Accept-Encoding";
}
# =============================================================================
# RUTAS DE LA APLICACIÓN
# =============================================================================
# Dashboard principal
location / {
root /app/src/dashboard;
index index.html;
# Configuración de caché para HTML principal
expires 10m;
add_header Cache-Control "public, must-revalidate";
# Fallback para SPA
try_files $uri $uri/ /index.html;
}
# API Backend - Proxy hacia Node.js
location /api/ {
# Configuración de proxy
proxy_pass http://localhost:3003;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
proxy_set_header X-Forwarded-Host $server_name;
# Configuración de timeouts para API
proxy_connect_timeout 5s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Configuración de buffers
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
# Caché para respuestas de API (solo GET)
proxy_cache_methods GET HEAD;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# Headers para no caché en API crítica
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
add_header Pragma "no-cache" always;
add_header Expires "0" always;
}
# Health check endpoint
location /health {
proxy_pass http://localhost:3003/health;
proxy_http_version 1.1;
proxy_set_header Connection "";
# Configuración optimizada para health checks
proxy_connect_timeout 1s;
proxy_send_timeout 1s;
proxy_read_timeout 1s;
# Sin caché para health checks
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
access_log off;
}
# WebSocket para tiempo real (si se implementa)
location /socket.io/ {
proxy_pass http://localhost:3003;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
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 específica para WebSockets
proxy_cache off;
proxy_buffering off;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# =============================================================================
# OPTIMIZACIONES DE RENDIMIENTO
# =============================================================================
# Caché para favicons
location = /favicon.ico {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
try_files $uri =204;
}
# Robots.txt
location = /robots.txt {
expires 1d;
add_header Cache-Control "public";
access_log off;
try_files $uri =204;
}
# Bloquear acceso a archivos de configuración
location ~ /\.(ht|env|git) {
deny all;
return 404;
}
# Bloquear acceso a archivos de backup
location ~ ~$ {
deny all;
return 404;
}
# =============================================================================
# CONFIGURACIÓN DE LOGS ESTRUCTURADOS
# =============================================================================
# Formato de log JSON para mejor análisis
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status":"$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent",'
'"http_x_forwarded_for":"$http_x_forwarded_for",'
'"upstream_response_time":"$upstream_response_time",'
'"upstream_addr":"$upstream_addr"'
'}';
# Aplicar log estructurado para rutas de API
location /api/stats {
proxy_pass http://localhost:3003;
access_log /var/log/nginx/api_access.log json_combined;
# Configuración de proxy estándar
proxy_http_version 1.1;
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 GLOBAL DE NGINX
# =============================================================================
# Configuración de worker processes (se ajusta automáticamente)
worker_processes auto;
worker_rlimit_nofile 65535;
# Configuración de eventos optimizada
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
# Configuración HTTP global
http {
# Tipos MIME optimizados
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Configuración de charset
charset utf-8;
# Optimizaciones de red
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Configuración de hash tables
types_hash_max_size 2048;
server_names_hash_bucket_size 64;
# Rate limiting global
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=general:10m rate=5r/s;
# Aplicar rate limiting
limit_req zone=general burst=20 nodelay;
}
# =============================================================================
# Optimizaciones aplicadas:
#
# 1. Compresión gzip: Reduce transferencia de datos hasta 70%
# 2. Caché estático: Assets con expiración de 1 año
# 3. Proxy buffering: Optimización de backend requests
# 4. Rate limiting: Protección contra abuse
# 5. Headers de seguridad: XSS, frame injection, etc.
# 6. Logs estructurados: JSON para mejor análisis
# 7. Timeouts optimizados: Balance entre UX y recursos
# 8. WebSocket ready: Preparado para tiempo real
#
# Performance esperado: 50-70% mejora en tiempo de carga
# =============================================================================