Saltar al contenido principal
50% de descuento todos los planes, tiempo limitado. Desde $2.48/mo
12 min left
Apps web y de negocio

Caddy vs Nginx en un VPS: la comparación de archivos de configuración

A Por Ariana 12 min de lectura
Side-by-side terminal view of a Caddyfile and an nginx.conf for the same reverse proxy on a VPS

Un VPS recién creado, un dominio apuntando a él y a un comando de distancia de tener un servidor web en marcha. Lo siguiente que escribas instalará Caddy o Nginx, y esa única decisión determina cuánto tiempo dedicarás a TLS durante toda la vida de la máquina. Así que: Caddy vs Nginx en un VPS, ¿cuál instalas?

Lo que sigue son las mismas tres configuraciones montadas en ambas herramientas, una al lado de la otra, con las cifras de memoria reportadas, el truco de los certificados comodín y notas de migración prácticas si ya estás en Nginx.

La versión corta

  • Veredicto: Caddy para la mayoría de las cargas de trabajo de un VPS recién creado, especialmente para desarrolladores en solitario, equipos pequeños y TLS que configuras y olvidas. Elige Nginx cuando necesites su ecosistema de módulos, un ajuste explícito, la experiencia existente del equipo o la menor huella de memoria posible.
  • HTTPS automático: Caddy obtiene y renueva los certificados por sí mismo. Sin Certbot, sin cron, sin hook de recarga. Nginx necesita Certbot (u otro cliente ACME) y la automatización de renovación que lo rodea.
  • Memoria: Nginx es más liviano, gracias a C frente a Go. La diferencia rara vez decide nada en un plan moderno; las cifras están en la tabla de abajo.
  • El truco: Caddy no es de configuración cero para los comodines. Un nombre como *.example.com necesita un desafío DNS, lo que implica un plugin y un token de API.

Toda la comparación en una sola pantalla:

CaddyNginx
LenguajeGoC
HTTPS automáticoIntegrado (Let's Encrypt + ZeroSSL)Ninguno; necesita Certbot u otro cliente ACME
Verbosidad de la configuraciónMínima (unas pocas líneas por sitio)Explícita y verbosa
HTTP/3Activado de forma predeterminada con HTTPSDisponible desde 1.25.0; debe habilitarse en la configuración de Nginx. Las compilaciones desde el código fuente requieren --with-http_v3_module.
Memoria en reposo reportada15-25 MB2-8 MB
Memoria reportada con 1000 conexiones80-120 MB50-80 MB
Ecosistema de módulosMás pequeño, se amplía mediante xcaddyGrande y maduro
LicenciaApache 2.0BSD-2-Clause

Los rangos de memoria provienen de una prueba de VPS de un tercero y deben tratarse como orientativos y no como requisitos universales. El uso real depende de las versiones del software, los módulos habilitados, el registro, el tráfico y la metodología de la prueba. La información de versión y licencia proviene de los repositorios oficiales de los proyectos.

El HTTPS automático de Caddy (y qué reemplaza realmente)

How Caddy's automatic HTTPS replaces the Nginx plus Certbot workflow by handling certificate issuance, renewal, and HTTP-to-HTTPS redirects inside the server

Caddy obtiene y renueva los certificados TLS por su cuenta. Apunta un dominio público a la máquina, ejecuta Caddy, y obtiene un certificado de Let's Encrypt o ZeroSSL, y luego lo renueva en segundo plano. Sin Certbot, sin tarea cron, sin hook de recarga posterior a la renovación. Ese es el HTTPS automático de Caddy en una frase, y es toda la razón por la que la gente se cambia.

Bajo el capó, Caddy usa el desafío HTTP-01 (port 80) o TLS-ALPN-01 (port 443) para demostrar la propiedad del dominio, y luego mantiene el certificado actualizado sin que intervenga ninguna segunda herramienta.

El equivalente en Nginx usa un cliente ACME separado. Con el habitual certbot --nginx flujo de trabajo, Certbot puede obtener e instalar el certificado, y luego reutilizar el mismo plugin y las opciones guardadas durante la renovación. La mayoría de las instalaciones de Certbot también incluyen una tarea programada que se ejecuta certbot renew automáticamente.

Si usas certbot certonly u otro cliente ACME que solo escribe los archivos renovados en disco, añade un deploy hook que recargue Nginx tras una renovación exitosa. Esa configuración funciona, pero aun así deja más piezas móviles que Caddy: el servidor web, el cliente ACME, el programador de renovación y cualquier hook de despliegue siguen siendo componentes separados.

La ventaja operativa de Caddy es que la emisión, el despliegue y la renovación de certificados, y las redirecciones de HTTP a HTTPS, están integrados en el propio servidor. De forma predeterminada, Caddy comienza a intentar la renovación cuando queda aproximadamente un tercio de la vida útil de un certificado, 30 días para un certificado de 90 días, a menos que la autoridad de certificación especifique una ventana de renovación diferente.

Consejo pro: Los desafíos ACME predeterminados de Caddy necesitan accesibilidad pública en port 80 o 443: HTTP-01 usa port 80, mientras que TLS-ALPN-01 usa port 443. Si port 80 está bloqueado pero 443 está abierto, TLS-ALPN puede seguir funcionando; si la máquina no está de cara a internet, usa DNS-01, igual que los certificados comodín de más abajo.

Los archivos de configuración, uno al lado del otro

The same HTTPS reverse proxy written as a short Caddyfile and a longer nginx.conf server block, side by side

Aquí tienes tres configuraciones habituales de VPS, un proxy inverso HTTPS, el servicio de archivos estáticos y la autenticación básica, escritas para ambas herramientas. Los ejemplos de Caddy incluyen HTTPS automático. Los ejemplos de Nginx dan por hecho que ya se ha aprovisionado un certificado, y los ejemplos de archivos estáticos y de autenticación básica muestran solo el bloque de servidor HTTPS. Reutiliza el bloque de redirección de port 80 del primer ejemplo si quieres un comportamiento equivalente de HTTP a HTTPS.

Un proxy inverso a una aplicación local en el port 3000:

Caddyfile

example.com {
    reverse_proxy localhost:3000
}

nginx.conf

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    location / {
        proxy_pass http://localhost:3000;
        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;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

Las líneas TLS en el bloque de Nginx dan por hecho que Certbot ya se ejecutó. Para un upstream HTTP como el anterior, Caddy pasa el Host encabezado entrante tal cual y establece X-Forwarded-For, X-Forwarded-Proto, y X-Forwarded-Host de forma predeterminada. Con Nginx, normalmente añades los encabezados de proxy de forma explícita cuando el upstream necesita el host original, el esquema y la cadena de direcciones del cliente. Ese es el compromiso en miniatura: Caddy incluye valores predeterminados de proxy prácticos, mientras que Nginx hace explícito más de ese comportamiento.

Servicio de archivos estáticos:

Caddyfile

example.com {
    root * /var/www
    file_server
}

nginx.conf

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    root /var/www;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
}

Autenticación básica, protegiendo todo detrás de un nombre de usuario y una contraseña:

Caddyfile

example.com {
    basic_auth {
        Bob $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG
    }
    reverse_proxy localhost:3000
}

nginx.conf

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
    location / {
        proxy_pass http://localhost:3000;
        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;
    }
}

Ambas herramientas cifran la contraseña con hash fuera de banda. Caddy usa caddy hash-password; Nginx usa htpasswd para construir el archivo .htpasswd. La directiva es basic_auth en el Caddy actual, por cierto. Era basicauth hasta que v2.8.0 la renombró, como se indica en la documentación de basic_auth de Caddy, y los tutoriales antiguos siguen haciendo tropezar a la gente con ello.

Consejo pro: Ese hash en el Caddyfile no es la contraseña. Es la salida bcrypt de caddy hash-password. Ejecuta el comando y pega lo que imprime. Caddy rechaza las contraseñas en texto plano en la configuración, lo cual es el valor predeterminado correcto y una pequeña sorpresa la primera vez.

Las configuraciones hablan por sí solas. Caddy condensa TLS, encabezados de proxy razonables y una redirección en unas pocas líneas; Nginx es explícito y verboso y te entrega cada perilla. Si has pasado años en Nginx, la verbosidad es memoria muscular y el control es justo el punto. Si no, el Caddyfile es una configuración que puedes retener en la cabeza. El punto práctico es sencillo: la configuración de Caddy es más fácil de leer de un vistazo, mientras que Nginx te da un control más explícito.

Rendimiento y memoria: leer los benchmarks con cuidado

Reading Caddy vs Nginx benchmarks carefully: Nginx generally uses less memory and leads on throughput, but the margin depends heavily on hardware and workload

Las pruebas publicadas apuntan en la misma dirección general: Nginx suele usar menos memoria y a menudo lidera en rendimiento bruto, pero el tamaño de esa ventaja depende en gran medida del entorno.

In una prueba de un tercero en una VM de cuatro núcleos, Nginx alcanzó aproximadamente 48 000 solicitudes por segundo, frente a unas 42 000 de Caddy. La misma prueba reportó una latencia p99 de HTTPS de 2,1 ms para Nginx y 2,4 ms para Caddy. Trátalos como resultados de una sola configuración y no como un margen de rendimiento universal.

Los rangos de memoria de la tabla comparativa provienen de una prueba de VPS aparte. Otra prueba sintética con 50 000 conexiones concurrentes reportó 145 MB para Nginx y 520 MB para Caddy, pero esa prueba usó condiciones de hardware y carga de trabajo sustancialmente diferentes. Sus cifras absolutas no deben compararse directamente con los números de VPS de arriba.

La conclusión fiable es más acotada: Nginx generalmente tiene la menor huella de memoria y tiende a liderar en cargas de trabajo de alto rendimiento o alta concurrencia. Para un proxy inverso ordinario en un VPS de gama pequeña a media, ambos suelen ser lo bastante rápidos, así que la simplicidad operativa suele ser el factor decisivo más útil.

Conclusión de la sección: elige según la operativa, a menos que tu servidor tenga memoria limitada o tus propias pruebas de carga muestren que el rendimiento del proxy es el cuello de botella.

El truco del certificado comodín (Caddy no siempre es de configuración cero)

The wildcard certificate catch: a cert for a star-dot-example.com name needs DNS-01 validation, which means a DNS-provider plugin and an API token, not Caddy's default zero-config path

Caddy puede automatizar los certificados comodín, pero no con sus desafíos HTTP-01 o TLS-ALPN-01 predeterminados. Un certificado para *.example.com requiere validación DNS-01, que Let's Encrypt exige para los certificados comodín. Eso implica un plugin de proveedor de DNS (integrado en tu binario de Caddy mediante xcaddy) más un token de API para tu host de DNS, configurado en el bloque tls. No es la historia de escribe-una-línea-y-olvídate que Caddy promociona.

Esto pilla a los usuarios de homelab que ponen muchos servicios bajo un dominio real que controlan, como *.home.example.com, y dan por hecho que la emisión de comodines es tan automática como app.example.com. Para nombres puramente internos como *.homelab.internal, trátalo como territorio de PKI local/interna, no como un comodín público de Let's Encrypt. Para ser precisos: Caddy hace bien los comodines, simplemente no los hace con los desafíos predeterminados, y la configuración es un paso más que en el caso de un solo dominio. Nginx está en el mismo barco aquí, ya que el requisito de DNS-01 viene de Let's Encrypt, no del servidor.

Si quieres una GUI: Nginx Proxy Manager (un breve inciso)

Nginx Proxy Manager es un animal distinto de las dos herramientas anteriores, y merece un párrafo porque el nombre confunde a la gente. NPM es un envoltorio con GUI sobre Nginx: gestiona reglas de proxy inverso y certificados de Let's Encrypt a través de una interfaz web en el port 81. No es Nginx core, y no se configura como se configura Nginx core.

El compromiso es el habitual de clic frente a configuración. NPM es el botón fácil hasta que te sales del camino feliz. Su configuración se gestiona a través de una base de datos de la aplicación en lugar de un único archivo de configuración editado a mano. La configuración predeterminada de Docker usa SQLite, mientras que MySQL/MariaDB y PostgreSQL son opciones de base de datos externa admitidas. Esa diferencia también afecta a la portabilidad: una configuración de Caddy a menudo se puede mover copiando un único Caddyfile, mientras que un despliegue de Nginx Proxy Manager requiere que se conserven sus datos de aplicación y su base de datos . NPM es una buena elección si de verdad prefieres hacer clic a editar y tu configuración se mantiene simple. Es la elección equivocada para un flujo de trabajo de infraestructura como código.

Migrar de Nginx a Caddy (qué se traslada y qué no)

Migrating from Nginx to Caddy: reverse-proxy headers, PHP blocks, and WebSocket handling get shorter, while custom modules and complex rewrites need a manual rethink

Si ya estás en Nginx y sopesas el cambio, empieza por rebajar tus expectativas sobre la automatización: existe un adaptador de configuración de NGINX para Caddy, pero está incompleto y no debe tratarse como un camino de migración fiable de un solo paso. Una migración de Nginx a Caddy es en su mayoría una reescritura manual, y la mayor parte se acorta.

Lo que se traslada y se simplifica, según la guía de conversión de la comunidad de Caddy:

  • Para upstreams HTTP, reverse_proxy pasa el Host encabezado entrante tal cual y establece los encabezados X-Forwarded-* estándar de forma predeterminada, así que la mayoría de esas proxy_set_header líneas desaparecen.
  • PHP se reduce de un bloque location con try_files más fastcgi_pass más un montón de parámetros a una única php_fastcgi directiva.
  • El manejo de WebSocket es automático en Caddy v2. Si un tutorial te dice que añadas una websocket directiva aparte, es una reliquia de Caddy v1. Ignórala.

Lo que no se traslada automáticamente: cualquier cosa ligada a un módulo específico de Nginx que Caddy no tiene, la lógica compleja de rewrite y location que tendrás que replantear en lugar de portar, y las configuraciones de certificados comodín, que te devuelven a la configuración del desafío DNS de la sección anterior. Reserva tiempo para los módulos y las reescrituras; el resto suele ser una reducción neta de líneas.

¿Cuál deberías instalar? (La decisión)

Has visto las configuraciones, los números, el truco del comodín y el coste de migración, así que aquí queda la cosa. Instala Caddy si eres un desarrollador en solitario o un equipo pequeño, esto es un despliegue en un VPS recién creado, quieres TLS que configuras y olvidas, ejecutas Docker con enrutamiento simple, o simplemente quieres una configuración que quepa en la memoria muscular. Esa es la mayoría de quienes leen esto.

Instala Nginx si necesitas un control detallado o un módulo específico de su ecosistema maduro, estás exprimiendo el rendimiento de un servidor con memoria limitada, estás haciendo servicio de archivos estáticos de alta concurrencia, o tu equipo ya tiene una profunda experiencia en Nginx y un montón de configuraciones que funcionan. Son razones sólidas, y si una de ellas es la tuya, Nginx es la decisión correcta. Este no es un caso en el que la herramienta más antigua sea la herramienta equivocada.

Cualquiera que elijas, el siguiente paso es ponerlo en la máquina. Ambos Caddy y Nginx están disponibles como despliegues con un clic en nuestro marketplace, así que puedes saltarte el trabajo de instalación e ir directo al Caddyfile o al bloque de servidor. Un VPS de 1 GB es un punto de partida razonable para un despliegue de un solo sitio con poco tráfico, pero dimensiona el servidor según la aplicación y el tráfico que hay detrás del proxy, y no según el proxy por sí solo. Si usas Caddy como puerta de entrada para servicios autoalojados, puede situarse delante de un stack de monitorización con Prometheus y Grafana o de un despliegue de Uptime Kuma sin requerir herramientas de TLS aparte.

Conclusión de la sección: elige Caddy a menos que tengas una razón específica que apunte a Nginx.

Preguntas frecuentes

¿Caddy reemplaza a Certbot?

Sí. Caddy puede obtener y renovar certificados públicos por sí mismo, incluidos los certificados comodín, así que Certbot no es necesario. Los comodines necesitan validación DNS-01, lo que implica configurar un módulo de proveedor de DNS compatible y credenciales de API.

¿Caddy usa menos memoria que Nginx?

No. Nginx generalmente tiene una menor huella de memoria. Una prueba de VPS de un tercero reportó 2-8 MB en reposo para Nginx y 15-25 MB para Caddy, pero esas cifras son específicas de la carga de trabajo y no requisitos de memoria fijos. La diferencia importa más en servidores con memoria limitada que ejecutan varios servicios.

¿Es Caddy más rápido que Nginx?

Depende de la carga de trabajo. Ambos son normalmente lo bastante rápidos para el tráfico típico de proxy inverso en un VPS. En las pruebas citadas, Nginx lideró en rendimiento bruto y eficiencia de memoria, pero el tamaño de la diferencia cambió sustancialmente según el hardware, el patrón de tráfico y el nivel de concurrencia. No hay un único porcentaje que se aplique a todos los despliegues.

¿Caddy admite certificados SSL comodín?

Sí. Un comodín como *.example.com requiere validación DNS-01. Una vez que Caddy tiene un módulo de proveedor de DNS compatible y credenciales de API, puede obtener y renovar el certificado comodín automáticamente.

¿Nginx Proxy Manager es lo mismo que Nginx?

No. Nginx Proxy Manager es un envoltorio con GUI sobre Nginx que almacena su configuración en una base de datos de la aplicación, usa una UI web en el port 81 y gestiona hosts de proxy inverso y certificados a través de esa interfaz. Nginx core se configura con archivos de texto y no tiene una GUI propia.

¿Cuándo debería usar Nginx en lugar de Caddy?

Elige Nginx cuando necesites un control detallado, un módulo específico de su ecosistema maduro, hasta el último MB en un servidor con memoria limitada, servicio de archivos estáticos de alta concurrencia, o cuando ya tengas una profunda experiencia en Nginx en el equipo.

Compartir

Más del blog

Sigue leyendo.

¿Listo para desplegar? Desde $2,48/mes.

Cloud independiente desde 2008. AMD EPYC, NVMe, 40 Gbps. Reembolso en 14 días.