Instalación y Configuración del Servidor Web Caddy

Caddy es un servidor web moderno y fácil de usar escrito en Go que aprovisiona automáticamente y renueva certificados HTTPS de Let's Encrypt. A diferencia de los servidores web tradicionales que requieren configuración SSL compleja, Caddy maneja la gestión de certificados de forma transparente, lo que lo hace ideal para administradores de sistemas que administran múltiples dominios. Esta guía cubre instalación, configuración a través de Caddyfiles, y escenarios avanzados de proxy inverso.

Tabla de Contenidos

  1. Introducción
  2. Requisitos del Sistema
  3. Métodos de Instalación
  4. Instalación Binaria
  5. Instalación del Administrador de Paquetes
  6. Conceptos Básicos de Caddyfile
  7. Configuración de Proxy Inverso
  8. Servidor de Archivos Estáticos
  9. Soporte PHP
  10. Configuración de Puerta de API
  11. HTTPS Automático
  12. Solución de Problemas y Monitoreo

Introducción

Caddy es un servidor web poderoso diseñado con seguridad y facilidad de uso como objetivos principales. Su característica más distintiva es HTTPS automático: Caddy obtiene y renueva automáticamente certificados SSL/TLS de Let's Encrypt sin ninguna configuración adicional. Esta guía te ayuda a aprovechar las capacidades de Caddy en entornos de producción.

Requisitos del Sistema

Asegúrate de que tu VPS o servidor bare metal cumpla con estos requisitos:

  • Kernel de Linux 3.10 o más nuevo
  • 256 MB de RAM mínimo (1 GB recomendado)
  • 50 MB de espacio en disco
  • Puertos 80 y 443 accesibles para HTTPS
  • Conectividad a Internet para validación de certificados
  • Acceso Sudo o root

Caddy admite múltiples arquitecturas: x86_64, ARM, ARM64 y MIPS.

Métodos de Instalación

Caddy se puede instalar a través de varios métodos dependiendo de tu preferencia por actualizaciones y mantenibilidad.

Instalación Binaria

Descarga la última versión de Caddy:

cd /tmp
wget https://github.com/caddyserver/caddy/releases/download/v2.7.4/caddy_2.7.4_linux_amd64.tar.gz
tar xzf caddy_2.7.4_linux_amd64.tar.gz

Crea los directorios y cuenta de usuario necesarios del sistema:

sudo useradd -r -s /bin/false -d /var/lib/caddy -m caddy
sudo mkdir -p /etc/caddy
sudo mkdir -p /var/www
sudo mkdir -p /var/log/caddy
sudo chown -R caddy:caddy /var/lib/caddy /var/log/caddy /etc/caddy

Instala el binario y establece permisos:

sudo mv /tmp/caddy /usr/local/bin/caddy
sudo chmod +x /usr/local/bin/caddy
sudo setcap cap_net_bind_service=+ep /usr/local/bin/caddy

El comando setcap permite que Caddy se enlace a los puertos 80 y 443 sin requerir privilegios de root.

Crea un archivo de servicio systemd:

sudo tee /etc/systemd/system/caddy.service > /dev/null <<EOF
[Unit]
Description=Caddy Web Server
Documentation=https://caddyserver.com/docs/
After=network-online.target
Wants=network-online.target

[Service]
User=caddy
Group=caddy
ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile
Type=notify
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
SyslogIdentifier=caddy

[Install]
WantedBy=multi-user.target
EOF

Habilita e inicia Caddy:

sudo systemctl daemon-reload
sudo systemctl enable caddy
sudo systemctl start caddy

Instalación del Administrador de Paquetes

Para sistemas Debian/Ubuntu, usa el repositorio oficial:

sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl https://dl.filippo.io/caddy/key.gpg | sudo tee /etc/apt/trusted.gpg.d/caddy-filippo.asc > /dev/null
echo "deb [signed-by=/etc/apt/trusted.gpg.d/caddy-filippo.asc] https://dl.filippo.io/caddy/deb stable main" | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Para sistemas RHEL/CentOS:

sudo dnf copr enable @caddy/caddy
sudo dnf install caddy
sudo systemctl start caddy
sudo systemctl enable caddy

Conceptos Básicos de Caddyfile

Crea un Caddyfile en /etc/caddy/Caddyfile para definir cómo Caddy sirve tu contenido:

example.com www.example.com {
    root * /var/www/html
    file_server
    encode gzip
}

Esta configuración básica sirve archivos estáticos desde /var/www/html con HTTPS automático.

Maneja múltiples sitios en un único Caddyfile:

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

api.example.com {
    reverse_proxy localhost:8080
}

blog.example.com {
    reverse_proxy localhost:3000
}

Recarga la configuración sin reiniciar:

sudo caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile

Configuración de Proxy Inverso

Caddy destaca en la proxificación inversa de aplicaciones backend:

app.example.com {
    reverse_proxy localhost:8080 {
        header_uri -Authorization
        health_uri /health
        health_interval 10s
        health_timeout 5s
        policy least_conn
    }
}

Configura múltiples servidores backend con balanceo de carga:

api.example.com {
    reverse_proxy localhost:8001 localhost:8002 localhost:8003 {
        health_uri /api/health
        health_interval 5s
        header_up Host {http.request.host}
        header_up X-Forwarded-For {http.request.remote.host}
        header_up X-Forwarded-Proto {http.request.scheme}
    }
}

Maneja enrutamiento basado en rutas:

example.com {
    handle /api/* {
        reverse_proxy localhost:8080
    }
    
    handle /static/* {
        root * /var/www/static
        file_server
    }
    
    handle {
        reverse_proxy localhost:3000
    }
}

Servidor de Archivos Estáticos

Configura Caddy como servidor de archivos estáticos de alto rendimiento:

cdn.example.com {
    root * /var/www/cdn
    file_server {
        precompressed br gzip
        index index.html
    }
    
    encode gzip
    
    header Cache-Control "public, max-age=31536000"
    
    @immutable {
        path /assets/*
    }
    header @immutable Cache-Control "public, immutable, max-age=31536000"
}

Caddy comprime automáticamente archivos y sirve versiones optimizadas a clientes que admiten brotli o gzip.

Soporte PHP

Habilita soporte PHP integrándose con PHP-FPM:

example.com {
    root * /var/www/html
    
    php_fastcgi localhost:9000 {
        dial timeout 3s
        read timeout 30s
        write timeout 30s
    }
    
    file_server
    encode gzip
}

Asegúrate de que PHP-FPM se está ejecutando:

sudo systemctl status php8.2-fpm
sudo systemctl enable php8.2-fpm

Configura el oyente de PHP-FPM (edita /etc/php/8.2/fpm/pool.d/www.conf):

[www]
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1

Recarga PHP-FPM:

sudo systemctl reload php8.2-fpm

Configuración de Puerta de API

Configura Caddy como puerta de API con múltiples rutas:

api.example.com {
    encode gzip
    
    @v1 {
        path_regexp ^/v1/.*
    }
    handle @v1 {
        reverse_proxy localhost:8001 {
            uri /
        }
    }
    
    @v2 {
        path_regexp ^/v2/.*
    }
    handle @v2 {
        reverse_proxy localhost:8002 {
            uri /
        }
    }
    
    handle {
        respond "API not found" 404
    }
}

Añade middleware de autenticación:

api.example.com {
    @protected {
        not header Authorization Bearer*
    }
    respond @protected 401
    
    reverse_proxy localhost:8080
}

HTTPS Automático

Caddy aprovisiona automáticamente certificados HTTPS:

example.com www.example.com {
    root * /var/www/html
    file_server
    encode gzip
}

Especifica proveedores de certificados personalizados o almacenamiento:

{
    storage file_system {
        root /var/lib/caddy/certificates
    }
    
    acme_ca https://acme.letsencrypt.org/directory
    acme_email [email protected]
}

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

Monitorea la expiración de certificados:

sudo caddy list-certs

Renueva certificados manualmente:

sudo caddy renew

Solución de Problemas y Monitoreo

Comprueba el estado del servicio Caddy:

sudo systemctl status caddy
sudo journalctl -u caddy -n 50 -f

Valida la sintaxis del Caddyfile:

sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile

Comprueba el estado del certificado:

sudo caddy list-certs

Monitorea métricas de Caddy con la API de administración:

curl http://localhost:2019/config/
curl http://localhost:2019/metrics?namespace=caddy

Habilita métricas en el Caddyfile:

{
    admin localhost:2019
    metrics
}

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

Prueba la configuración HTTPS:

curl -i https://example.com
openssl s_client -connect example.com:443 -servername example.com

Depura problemas de configuración:

sudo caddy run --config /etc/caddy/Caddyfile --adapter caddyfile --debug

Comprueba el enlace del puerto:

sudo netstat -tlnp | grep caddy

Verifica la resolución DNS:

nslookup example.com
dig example.com

Conclusión

Caddy proporciona un servidor web moderno y fácil de usar que elimina la complejidad de la configuración SSL/TLS. Su HTTPS automático, sintaxis directa de Caddyfile y capacidades integradas de proxy inverso lo hacen ideal para VPS en la nube e implementaciones bare metal. Ya sea sirviendo archivos estáticos, proxificando servicios backend o implementando puertas de API, Caddy entrega rendimiento confiable con sobrecarga de configuración mínima.