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
- Introducción
- Requisitos del Sistema
- Métodos de Instalación
- Instalación Binaria
- Instalación del Administrador de Paquetes
- Conceptos Básicos de Caddyfile
- Configuración de Proxy Inverso
- Servidor de Archivos Estáticos
- Soporte PHP
- Configuración de Puerta de API
- HTTPS Automático
- 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.


