Nginx vs. Traefik: Cuál es el mejor reverse proxy?

Introducción

Este artículo profundiza en un análisis comparativo de Nginx y Traefik como proxies inversos (reverse proxies) . Examinaremos los indicadores clave de rendimiento, incluyendo la latencia (p99), el rendimiento (peticiones por segundo), la disponibilidad (tasa de error) y la utilización de recursos (CPU, memoria y tráfico de red). El análisis también considera el impacto en el rendimiento de las aplicaciones backend. Inspirados por este video, nuestro objetivo es proporcionar una comprensión integral de qué proxy podría ser el más adecuado para tus necesidades.

¿Qué es un Proxy Inverso?

Antes de entrar en detalles, definamos qué es un proxy inverso. Es un servidor que se sitúa delante de tu aplicación, enrutando las peticiones entrantes a las instancias de la aplicación backend. Piénsalo como un guardián, protegiendo tus valiosos servidores de aplicaciones del salvaje oeste de internet. Aquí te explicamos por qué son esenciales:

  • Balanceo de Carga (Load Balancing): Los proxies inversos (reverse proxies) distribuyen el tráfico entre múltiples instancias de la aplicación, permitiendo un escalado dinámico y una alta disponibilidad. ¿Necesitas escalar verticalmente durante las horas pico y reducir la escala durante las horas de menor actividad? Un proxy inverso te cubre las espaldas (y la billetera).
  • Actualizaciones Sin Tiempo de Inactividad (Zero-Downtime Upgrades): Actualiza tu aplicación una instancia a la vez sin interrumpir el servicio. Tus usuarios ni se darán cuenta, y podrás desplegar con un poco menos de miedo (solo un poco).
  • Terminación TLS (TLS Termination): Gestiona el cifrado TLS a nivel del proxy, liberando a tus servidores de aplicaciones de esta tarea que consume muchos recursos. Además, gestionas los certificados en un solo lugar, lo que evita a tu equipo de DevOps las interminables pesadillas de renovación de certificados.
  • Seguridad: Al proteger tus servidores de aplicaciones de la exposición directa a internet, los proxies inversos (reverse proxies) reducen tu superficie de ataque. Menos puntos de entrada expuestos significan menos oportunidades para esos molestos hackers.
  • Caché y Compresión (Caching and Compression): Almacena en caché el contenido estático (HTML, CSS, JavaScript) y comprime las respuestas para minimizar la latencia y mejorar el rendimiento. Cada milisegundo cuenta en el vertiginoso mundo de internet.

Comparación Nginx vs. Traefik

Comparemos Nginx y Traefik en varios aspectos clave:

Configuración

  • Nginx: Se basa principalmente en archivos de configuración estáticos. Si bien es potente y probado, requiere una curva de aprendizaje para dominarlo.
  • Traefik: Ofrece opciones de configuración tanto estáticas como dinámicas. Sus mecanismos de descubrimiento de servicios incorporados pueden detectar y configurar automáticamente las rutas para las aplicaciones desplegadas en entornos como Docker.

Gestión de Certificados TLS (TLS Certificate Management)

  • Nginx: Requiere una herramienta externa como Certbot para obtener y gestionar los certificados TLS. Si bien Certbot automatiza el proceso, es un componente adicional para instalar y configurar.
  • Traefik: Tiene soporte integrado para Let's Encrypt, lo que simplifica la adquisición y renovación de certificados. ¡Una cosa menos de qué preocuparse!

Métricas

  • Nginx (Código Abierto): Carece de métricas granulares para aplicaciones individuales. Si bien existen soluciones alternativas, la ausencia de métricas integradas es un inconveniente notable. La versión de pago Nginx Plus sí ofrece métricas más completas.
  • Traefik: Proporciona métricas en formato Prometheus, lo que facilita la monitorización del rendimiento y la resolución de problemas.

Contenido Estático (Static Content)

  • Nginx: Puede servir contenido estático, lo que lo convierte en una opción versátil para servidores web y proxies inversos (reverse proxies) .
  • Traefik: Se centra únicamente en el proxy inverso y no admite el servicio de contenido estático.

Configuración y Diseño de las Pruebas

Las pruebas se realizaron en AWS, utilizando instancias m7a.large para cada proxy e instancias EC2 medianas para las aplicaciones backend. Se utilizó un clúster EKS con instancias Graviton para la monitorización (Prometheus y Grafana) y la generación de carga. La versión de Nginx utilizada fue la 1.27.2 y la versión de Traefik la 3.2.0. Todos los archivos de configuración y scripts de Terraform están disponibles en GitHub.

tutorials/lessons/224 at 224 · antonputra/tutorials
DevOps Tutorials. Contribute to antonputra/tutorials development by creating an account on GitHub.

Resultados de las Pruebas

Latencia

Nginx demostró consistentemente una latencia menor durante toda la prueba, lo que indica una mejor experiencia de usuario. La latencia de Traefik aumentó a medida que se intensificaba la carga.

Rendimiento (Throughput)

Nginx logró un rendimiento significativamente mayor, alcanzando las 40.000 peticiones por segundo en comparación con las 17.000 de Traefik. Esto se traduce en posibles ahorros de costos en infraestructura.

Uso de CPU (CPU Usage)

El uso de CPU de Traefik alcanzó rápidamente el 100%, mientras que Nginx tenía más margen. Esto se alinea con los resultados de rendimiento, lo que sugiere que Traefik alcanzó su límite de rendimiento antes.

Uso de Memoria (Memory Usage)

El uso de memoria de Traefik aumentó con el tiempo, posiblemente debido al almacenamiento en caché. El uso de memoria de Nginx se mantuvo relativamente estable.

Tasa de Error (Error Rate)

Traefik intentó procesar cada petición, lo que afectó la latencia. Nginx, por otro lado, descartó un pequeño porcentaje de peticiones bajo carga extrema, priorizando la baja latencia para la mayoría de los usuarios.

Keep-Alive: El Factor Decisivo de Nginx

Un factor crucial en el rendimiento de Nginx es la configuración keep-alive. De forma predeterminada, Nginx no utiliza keep-alive para las conexiones backend, lo que genera una mayor carga en los servidores de aplicaciones. Habilitar keep-alive mejora drásticamente el rendimiento de Nginx al reutilizar las conexiones.

upstream backend {
    server backend1:8080;
    server backend2:8080;
    keepalive 16; # Habilitar keep-alive con 16 conexiones
}

server {
    # ... otras configuraciones

    location / {
        proxy_pass http://backend;
        proxy_http_version 1.1;
        proxy_set_header Connection ""; # Importante para keep-alive
    }
}

Conclusión

Nginx superó a Traefik en este benchmark, particularmente en rendimiento y latencia. Sin embargo, la facilidad de configuración de Traefik y el soporte integrado de Let's Encrypt son características atractivas. La elección entre los dos depende de tus necesidades y prioridades específicas. Si el rendimiento puro es primordial, Nginx, especialmente con keep-alive habilitado, parece ser el ganador. Si la facilidad de uso y la configuración dinámica son más importantes, Traefik podría ser una mejor opción.

Fuente

Anton Putra en Youtube

Nicolás Georger

Nicolás Georger

Self-taught IT professional driving innovation & social impact with cybernetics, open source (Linux, Kubernetes), AI & ML. Building a thriving SRE/DevOps community at SREDevOps.org. I specialize in simplifying solutions through cloud native technologies and DevOps practices.