Servidor web · 10 min read · Oct 30, 2025
Cómo instalar y configurar el servidor web Caddy con PHP en Fedora 34 / CentOS 8

Caddy es un servidor web de código abierto escrito en el lenguaje Go. Proporciona soporte para HTTP/3, TLS v1.3, configuración automática de SSL con Let’s Encrypt, proxy inverso y admite múltiples complementos para extender su funcionalidad. Tiene la ventaja de que toda su configuración se sirve desde un solo archivo, sin importar cuántos sitios necesites alojar.
Este tutorial cubrirá la instalación y configuración de Caddy y PHP en servidores basados en Fedora 34 y CentOS 8. Cubriremos cómo alojar sitios únicos y múltiples y cómo usar el proxy inverso junto con algunas otras características de seguridad.
Requisitos previos
- Servidor basado en Fedora 34 o CentOS 8
- Un usuario no root con privilegios de sudo
- Un nombre de dominio que apunte a la dirección IP del servidor
- SELinux está deshabilitado.
shell $ sudo setenforce 0 - Asegúrate de que todo esté actualizado.
shell $ sudo dnf update
Paso 1 - Configurar el Firewall
El primer paso es configurar el Firewall para abrir los puertos HTTP y HTTPS. Fedora y CentOS vienen con el firewall Firewalld preinstalado.
Verifica si el firewall está en funcionamiento.
$ sudo firewall-cmd --state
Deberías obtener la siguiente salida.
running
Verifica los servicios/puertos permitidos actuales.
$ sudo firewall-cmd --permanent --list-services
Debería mostrar la siguiente salida.
dhcpv6-client mdns ssh
Permite los puertos HTTP y HTTPS.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Vuelve a verificar el estado del firewall.
$ sudo firewall-cmd --permanent --list-services
Deberías ver una salida similar.
dhcpv6-client http https mdns ssh
Recarga el Firewall.
$ sudo systemctl reload firewalld
Paso 2 - Instalar Caddy
El primer paso es instalar el servidor. Los pasos de instalación son los mismos para Fedora 34 y CentOS 8.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Puedes verificar la instalación con el siguiente comando.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Paso 3 - Conceptos básicos de configuración de Caddy
Caddy utiliza JSON como formato principal para almacenar o escribir configuraciones. Es la forma más flexible de escribir la configuración y admite todas las características de Caddy. Pero si no sabes cómo escribir archivos JSON, Caddy ofrece una forma más fácil en forma de Caddyfile.
El paquete de Fedora / CentOS incluye un Caddyfile en /etc/caddy/Caddyfile. Debería verse como lo siguiente (ignorando los comentarios)
:80 {
root * /usr/share/caddy
file_server
}
Habilita e inicia el demonio de caddy.
$ sudo systemctl enable --now caddy
Puedes abrir la URL http://youripaddress para verificar. Deberías ver la siguiente página de bienvenida.

Caddy ofrece muchas características y configuraciones, por lo que solo iremos con las más importantes para servir nuestro sitio web. La configuración predeterminada sirve a través de HTTP, que se especifica como :80. La directiva root le dice a Caddy que busque los archivos que se servirán en el directorio /usr/share/caddy.
La directiva file_server le dice a Caddy que actúe como un servidor de archivos, lo que significa que solo servirá archivos estáticos a través de la dirección predeterminada.
Configurando Caddy para un sitio web HTML básico
Creemos un archivo de configuración de caddy básico para servir un sitio web estático.
Crea un directorio para alojar tu sitio web y almacenar tus archivos de registro.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Establece la propiedad del directorio a Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Crea un archivo HTML para probar y ábrelo para editar.
$ sudo nano /var/www/example.com/html/index.html
Agrega el siguiente código.
¡Hola desde Caddy!
¡Hola, desde Caddy!
Presiona Ctrl + X para cerrar el editor y presiona Y cuando se te pida guardar el archivo.
Abre el Caddyfile para editar.
$ sudo nano /etc/caddy/Caddyfile
Reemplaza el código existente con el siguiente.
example.com {
root * /var/www/example.com/html
file_server
encode gzip
log {
output file /var/log/caddy/example.access.log
}
@static {
file
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.pdf *.webp
}
header @static Cache-Control max-age=5184000
tls [email protected]
}
Presiona Ctrl + X para cerrar el editor y presiona Y cuando se te pida guardar el archivo.
Repasemos todas las directivas en el archivo. La directiva encode gzip le dice a Caddy que comprima los archivos utilizando compresión Gzip.
La directiva log envía el registro de acceso del sitio al archivo /var/log/caddy/example.access.log. Por defecto, Caddy rota los archivos de registro cuando alcanzan 100 MB. Los archivos rotados se eliminan después de 90 días o cuando hay más de 10 registros rotados. Puedes cambiar los parámetros predeterminados de la siguiente manera.
log {
output file /var/log/caddy/example.access.log {
roll_size 10MB
roll_keep 5
roll_keep_for 240h
}
}
En el código anterior, los archivos de registro rotados están limitados a 10 MB y se eliminan después de 10 días (240 horas) o cuando hay más de 5 registros rotados.
Caddy generará e instalará automáticamente el certificado SSL sin ninguna intervención. La directiva tls nos permite proporcionar opciones adicionales para configurar HTTPS, como la dirección de correo electrónico utilizada para obtener informes de Let’s Encrypt.
La directiva header habilita el control de caché en todos los archivos estáticos (imágenes/javascript/archivos CSS). Puedes agregar más extensiones de archivo o copiar el código para establecer diferentes duraciones para diferentes formatos de archivo. Tendrás que cambiar el valor static a algo diferente porque esa es una referencia nombrada.
Una vez terminado, puedes validar tu configuración utilizando el siguiente comando.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Debemos usar la opción --adapter caddyfile porque, por defecto, el comando solo valida configuraciones JSON.
Si recibes la siguiente advertencia, puedes solucionarlo fácilmente con un solo comando.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Ejecuta el siguiente comando para corregir el error.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
El comando anterior formatea y sobrescribe el Caddyfile.
Reinicia Caddy para habilitar la configuración. Necesitarás reiniciar el servidor cada vez que realices un cambio en la configuración.
$ sudo systemctl restart caddy
Abre en tu navegador y deberías ver la siguiente página, lo que significa que la configuración está funcionando.
Configurando múltiples sitios en Caddy
Puedes configurar múltiples sitios en un solo archivo de caddy. Para hacerlo, crea bloques separados para cada sitio de la siguiente manera.
example1.com {
root * /var/www/example1.com/html
...
}
example2.com {
root * /var/www/example2.com/html
...
}
Este método está bien para un par de sitios, pero un solo archivo puede volverse bastante grande y difícil de mantener si estás alojando múltiples sitios.
Crea el directorio /etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Ahora puedes importar los archivos de configuración desde el directorio en tu /etc/caddy/Caddyfile en la parte superior del archivo.
import caddyconf/*.conf
El paso final es crear archivos de configuración individuales para cada sitio.
Configurando sitios PHP
Hasta ahora, solo hemos hablado de servir sitios estáticos usando Caddy. También puedes usar Caddy tan fácilmente para servir sitios PHP dinámicos. Para habilitar el soporte de PHP, agrega el siguiente código dentro de tu bloque de sitio.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
También necesitarás instalar PHP.
$ sudo dnf install php-fpm php-cli php-gd
Puedes instalar cualquier módulo PHP adicional que necesites. También necesitarás configurar el archivo /etc/php-fpm.d/www.conf. Abre el archivo para editar.
$ sudo nano /etc/php-fpm.d/www.conf
Necesitamos establecer el usuario/grupo Unix de los procesos PHP en caddy. Busca las líneas user=apache y group=apache en el archivo y cámbialas a nginx.
...
; Usuario/grupo Unix de procesos
; Nota: El usuario es obligatorio. Si el grupo no está establecido, se utilizará el grupo del usuario predeterminado
; RPM: usuario apache elegido para proporcionar acceso a los mismos directorios que httpd
user = caddy
; RPM: Mantener un grupo permitido para escribir en el directorio de registro.
group = caddy
...
Busca la línea listen.acl_users = apache,nginx y cambia su valor a lo siguiente.
...
listen.acl_users = apache,nginx,caddy
...
Guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Inicia el proceso PHP-fpm.
$ sudo systemctl start php-fpm
Para probar tu configuración de PHP, crea un archivo test.php en la carpeta html.
$ sudo nano /var/www/example.com/html/test.php
Agrega el siguiente contenido a él y guarda el archivo presionando Ctrl + X y entrando Y cuando se te pida.
Lanza http://example.com/test.php en tu navegador web y deberías ver lo siguiente.

Configurando Proxy Inverso
Caddy también se puede usar como un servidor proxy inverso. Para configurarlo, utiliza el siguiente código.
example1.com {
...
reverse_proxy localhost:8000 {
header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
}
}
Paso 4 - Opciones globales de Caddy
El Caddyfile te permite establecer algunas opciones que se aplicarán globalmente, es decir, se aplicarán a todos tus sitios. Es beneficioso definir opciones globales para que no tengas que volver a declararlas en cada bloque de servidor.
Debes incluir las opciones globales en la parte superior de tu Caddyfile. Hay muchas opciones que puedes establecer globalmente. Solo revisaremos algunas importantes. Para el resto, debes consultar la documentación de Caddy.
Aquí hay algunas opciones predeterminadas que puedes usar en tu Caddyfile.
{
#Opciones TLS
email [email protected]
servers :443 {
protocol {
experimental_http3
}
max_header_size 5mb
}
servers :80 {
protocol {
allow_h2c
}
max_header_size 5mb
}
}
En el código anterior, email especifica la ID de correo electrónico utilizada para registrar el certificado SSL con la autoridad Let’s Encrypt. El OCSP stapling mejora el rendimiento de los sitios HTTPS al proporcionar información de revocación de certificados a los navegadores automáticamente. La opción max_header_size especifica el tamaño de los encabezados de solicitud HTTP del cliente que se van a analizar.
También hemos habilitado el protocolo HTTP/3 para sitios HTTPS y soporte para HTTP/2 para sitios HTTP. Estas son características experimentales y probablemente se eliminarán eventualmente, así que ten cuidado antes de habilitarlas.
Paso 5 - Mejorando la seguridad
Habilitando la autenticación HTTP
Puedes habilitar una autenticación HTTP simple para ciertos directorios. Primero, necesitas crear credenciales de autenticación para ello.
Caddy solo acepta contraseñas hash en la configuración. Así que necesitas crear primero una contraseña hash. Ejecuta el siguiente comando para hacerlo.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Una vez que tengas la contraseña lista, ingresa el siguiente código en tu Caddyfile.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
El comando anterior protegerá el directorio /secret con las credenciales que acabas de crear.
Endureciendo la seguridad del sitio y habilitando HSTS
Hay otras configuraciones de seguridad que puedes agregar para proteger tus sitios. Para eso, crearemos otro archivo /etc/caddy/caddy_security.conf.
$ sudo nano /etc/caddy/caddy_security.conf
Agrega el siguiente código a él.
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Xss-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Permissions-Policy "interest-cohort=()"
Content-Security-Policy "upgrade-insecure-requests"
Referrer-Policy "strict-origin-when-cross-origin"
Cache-Control "public, max-age=15, must-revalidate"
Feature-Policy "accelerometer 'none'; ambient-light-sensor 'none'; autoplay 'self'; camera 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; midi 'none'; payment 'none'; picture-in-picture *; speaker 'none'; sync-xhr 'none'; usb 'none'; vr 'none'"
}
El código anterior habilita/implementa lo siguiente.
- Habilita el soporte HSTS para el sitio y todos sus subdominios.
- Habilita el filtrado XSS.
- Previene la detección de contenido/MIME.
- Previene que tu sitio se cargue dentro de un IFRAME.
- Previene que tu sitio sea incluido en pruebas de seguimiento FLOC.
- Agrega una política de seguridad de contenido sobre cómo los agentes de usuario tratan las URL inseguras.
- Implementa una política de referencia para que solo se envíe la referencia para solicitudes de origen cruzado si el protocolo dice lo mismo.
- La política de características proporciona un mecanismo para habilitar y deshabilitar ciertas características del navegador.
A continuación, importa el archivo en cualquiera de los bloques de sitio que desees.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Reinicia el servidor para implementar el cambio.
Conclusión
Esto concluye el tutorial sobre la instalación y configuración del servidor web Caddy en servidores basados en Fedora 34 / CentOS 8. Si tienes alguna pregunta, publícalas en los comentarios a continuación.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.