Caddy es un servidor web de código abierto escrito en el lenguaje Go. Proporciona compatibilidad con HTTP/3, TLS v1.3, configuración automática de SSL con Let's Encrypt, proxy inverso y admite varios complementos para ampliar su funcionalidad. Tiene la ventaja de que toda su configuración se sirve desde un solo archivo sin importar cuántos sitios necesite 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 funciones de seguridad.
Requisitos
-
Servidor basado en Fedora 34 o CentOS 8
-
Un usuario no root con privilegios sudo
-
Un nombre de dominio que apunte a la dirección IP del servidor
-
SELinux está deshabilitado.
$ sudo setenforce 0
-
Asegúrate de que todo esté actualizado.
$ sudo dnf update
Paso 1:Configuración del cortafuegos
El primer paso es configurar el Firewall para abrir puertos HTTP y HTTPS. Fedora y CentOS vienen con el firewall Firewalld preinstalado.
Compruebe si el cortafuegos se está ejecutando.
$ sudo firewall-cmd --state
Deberías obtener el siguiente resultado.
running
Verifique los servicios/puertos permitidos actualmente.
$ sudo firewall-cmd --permanent --list-services
Debería mostrar el siguiente resultado.
dhcpv6-client mdns ssh
Permitir puertos HTTP y HTTPS.
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
Vuelva a comprobar el estado del cortafuegos.
$ sudo firewall-cmd --permanent --list-services
Debería ver un resultado similar.
dhcpv6-client http https mdns ssh
Vuelva a cargar el cortafuegos.
$ sudo systemctl reload firewalld
Paso 2:Instalar Caddy
El primer paso es instalar el servidor. Los pasos de instalación siguen siendo los mismos para Fedora 34 y CentOS 8.
$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy
Puede verificar la instalación con el siguiente comando.
$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=
Paso 3:Conceptos básicos de configuración del Caddy
Caddy usa JSON como formato principal para almacenar o escribir configuraciones. Es la forma más flexible de escribir la configuración y es compatible con todas las funciones de Caddy. Pero si no sabe cómo escribir archivos JSON, Caddy ofrece una forma más sencilla en forma de Caddyfile.
El paquete Fedora / CentOS incluye un archivo Caddy en /etc/caddy/Caddyfile
. Debería tener el siguiente aspecto (ignorando los comentarios)
:80 {
root * /usr/share/caddy
file_server
}
Habilite e inicie el demonio caddy.
$ sudo systemctl enable --now caddy
Puede abrir la URL http://youripaddress
verificar. Debería ver la siguiente página de bienvenida.
Caddy ofrece muchas funciones y configuraciones, por lo que solo elegiremos las importantes para servir nuestro sitio web. La configuración predeterminada sirve a través de HTTP, que se especifica como :80
. La root
directiva le dice a Caddy que busque los archivos que se van a servir en el /usr/share/caddy
directorio.
El file_server
La directiva le dice a Caddy que actúe como un servidor de archivos, lo que significa que solo servirá archivos estáticos en la dirección predeterminada.
Configurar Caddy para un sitio web HTML básico
Vamos a crear un archivo de configuración de caddy básico para servir un sitio web estático.
Cree un directorio para alojar su sitio web y almacenar sus archivos de registro.
$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy
Establezca la propiedad del directorio en Caddy.
$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy
Cree un archivo HTML para probarlo y ábralo para editarlo.
$ sudo nano /var/www/example.com/html/index.html
Agrega el siguiente código.
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>
Presiona Ctrl + X para cerrar el editor y presiona Y cuando se le solicite guardar el archivo.
Abra el archivo Caddy para editarlo.
$ sudo nano /etc/caddy/Caddyfile
Reemplace 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 le solicite guardar el archivo.
Repasemos todas las directivas del archivo. El encode gzip
directiva le dice a Caddy que comprima los archivos usando compresión Gzip.
El log
La directiva genera el registro de acceso para el sitio en /var/log/caddy/example.access.log
expediente. De forma predeterminada, Caddy rota los archivos de registro cuando alcanzan los 100 MB. Los archivos rotados se eliminan después de 90 días o cuando hay más de 10 registros rotados. Puede 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 tienen un límite de 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á el certificado SSL automáticamente sin ninguna intervención. El tls
La directiva nos permite proporcionar opciones adicionales para configurar HTTPS, como la dirección de correo electrónico utilizada para obtener los informes de Let's Encrypt.
El header
La directiva habilita el control de caché en todos los archivos estáticos (imágenes/javascript/archivos CSS). Puede agregar más extensiones de archivo o copiar el código para establecer una duración diferente para diferentes formatos de archivo. Tendrás que cambiar el valor static
a algo diferente porque esa es una referencia con nombre.
Una vez terminado, puede validar su configuración usando el siguiente comando.
$ caddy validate --adapter caddyfile --config /etc/caddy/Caddyfile
Tenemos que usar el --adapter caddyfile
porque, por defecto, el comando solo valida configuraciones JSON.
Si recibe la siguiente advertencia, puede solucionarlo fácilmente con un solo comando.
WARN input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}
Ejecute el siguiente comando para corregir el error.
$ caddy fmt --overwrite /etc/caddy/Caddyfile
El comando anterior formatea y sobrescribe el archivo Caddy.
Reinicie Caddy para habilitar la configuración. Deberá reiniciar el servidor cada vez que realice un cambio en la configuración.
$ sudo systemctl restart caddy
Ábralo en su navegador y debería ver la siguiente página, lo que significa que la configuración está funcionando.
Configuración de varios sitios en Caddy
Puede configurar varios sitios en un solo archivo caddy. Para hacer eso, cree 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 uno solo puede volverse bastante grande y difícil de mantener si aloja varios sitios.
Cree el directorio `/etc/caddy/caddyconf.
$ sudo mkdir /etc/caddy/caddyconf
Ahora puede importar los archivos de configuración desde el directorio en su /etc/caddty/caddyfile
en la parte superior del archivo.
import caddyconf/*.conf
El paso final es crear archivos de configuración individuales para cada sitio.
Configuración de sitios PHP
Hasta ahora, solo hemos hablado sobre servir sitios estáticos usando Caddy. También puede usar Caddy con la misma facilidad para servir sitios PHP dinámicos. Para habilitar la compatibilidad con PHP, agregue el siguiente código dentro del bloque de su sitio.
example1.com {
root * /var/www/example1.com/html
...
php_fastcgi unix//run/php-fpm/www.sock
}
También deberá instalar PHP.
$ sudo dnf install php-fpm php-cli php-gd
Puede instalar cualquier módulo PHP adicional que necesite. También deberá configurar el archivo /etc/php-fpm.d/www.conf
. Abra el archivo para editarlo.
$ sudo nano /etc/php-fpm.d/www.conf
Necesitamos configurar el usuario/grupo de procesos PHP de Unix en caddy . Encuentra el user=apache
y group=apache
líneas en el archivo y cámbielas a nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = caddy
; RPM: Keep a group allowed to write in log dir.
group = caddy
...
Busque la línea listen.acl_users = apache,nginx
y cambia su valor a lo siguiente.
...
listen.acl_users = apache,nginx,caddy
...
Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
Inicie el proceso PHP-fpm.
$ sudo systemctl start php-fpm
Para probar su configuración de PHP, cree un archivo test.php
en el html
carpeta.
$ sudo nano /var/www/example.com/html/test.php
Agregue el siguiente contenido y guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.
<?php phpinfo();
Inicie http://example.com/test.php
en su navegador web, y debería ver lo siguiente.
Configuración de proxy inverso
Caddy también se puede utilizar como servidor proxy inverso. Para configurarlo, use 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
Caddyfile le permite configurar algunas opciones que se aplicarán globalmente, es decir, se aplicarán a todos sus sitios. Es beneficioso definir opciones globales para que no tenga que volver a declararlas en cada bloque de servidor.
Debe incluir las opciones globales en la parte superior de su Caddyfile. Hay muchas opciones que puede configurar globalmente. Pasaremos por algunos importantes solamente. Para el resto, debe consultar la documentación de Caddy.
Aquí hay algunas opciones predeterminadas que puede usar en su Caddyfile.
{
#TLS Options
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 el ID de correo electrónico utilizado para registrar el certificado SSL con la autoridad de Let's Encrypt. El grapado OCSP mejora el rendimiento de los sitios HTTPS al proporcionar información de revocación de certificados a los navegadores automáticamente. El max_header_size
La opción especifica el tamaño de los encabezados de solicitud HTTP del cliente que se analizarán.
También hemos habilitado el protocolo HTTP/3 para sitios HTTPS y compatibilidad con HTTP/2 para sitios HTTP. Estas son funciones experimentales y probablemente se eliminen eventualmente, así que tenga cuidado antes de habilitarlas.
Paso 5:Mejora de la seguridad
Habilitación de la autenticación HTTP
Puede habilitar la autenticación HTTP simple para ciertos directorios. Primero, debe crear credenciales de autenticación para ello.
Caddy solo acepta contraseñas hash en la configuración. Por lo tanto, primero debe crear una contraseña cifrada. Ejecute el siguiente comando para hacerlo.
$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
Una vez que tenga la contraseña lista, ingrese el siguiente código en su Caddyfile.
basicauth /secret/* {
John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}
El comando anterior protegerá el /secret
directorio con las credenciales que acaba de crear.
Reforzar la seguridad del sitio y habilitar HSTS
Hay otras configuraciones de seguridad que puede agregar para proteger sus sitios. Para eso, crearemos otro archivo /etc/caddy/caddy_security.conf
.
$ sudo nano /etc/caddy/caddy_security.conf
Agregue el siguiente código.
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 la compatibilidad con HSTS para el sitio y todos sus subdominios.
- Habilita el filtrado XSS.
- Evita la detección de contenido/MIME.
- Evita que tu sitio se cargue dentro de un IFRAME.
- Evita que su sitio se incluya en las pruebas de seguimiento de FLOC.
- Agrega una política de seguridad de contenido sobre cómo los agentes de usuario tratan las URL no seguras.
- 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 funciones proporciona un mecanismo para habilitar y deshabilitar ciertas funciones del navegador.
A continuación, importe el archivo en cualquiera de los bloques del sitio que desee.
example.com {
...
import /etc/caddy/caddy_security.conf
}
Reinicie 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 tiene alguna pregunta, publíquela en los comentarios a continuación.