Cómo instalar y configurar el servidor web Caddy con PHP en Fedora 34 / CentOS 8

P√°gina de bienvenida de Caddy

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 previos

  • 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

Compruebe 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ías ver una salida 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 de 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 fácil 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 para verificar. Debería ver la siguiente página de bienvenida.

P√°gina de bienvenida de Caddy

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 directiva raíz le dice a Caddy que busque los archivos que se van a servir 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 en la direcci√≥n predeterminada.

Configuración de 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>

Prensa Control + X para cerrar el editor y pulsar 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]
}

Prensa Control + X para cerrar el editor y pulsar Y cuando se le solicite guardar el archivo.

Repasemos todas las directivas del archivo. La directiva codificar gzip le dice a Caddy que comprima los archivos usando la compresión Gzip.

La directiva de registro genera el registro de acceso del sitio al archivo /var/log/caddy/example.access.log. 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. La directiva tls nos permite brindar opciones adicionales para configurar HTTPS, como la direcci√≥n de correo electr√≥nico utilizada para obtener los informes de Let’s Encrypt.

La directiva de encabezado 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á que cambiar el valor estático a algo diferente porque es una referencia con nombre.

Una vez terminado, puedes validar tu configuración usando el siguiente comando.

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

Tenemos que usar la opci√≥n –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.

Portada del caddie

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 archivo /etc/caddty/caddy 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 necesitará 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 Unix de procesos PHP para caddie. Busque las líneas user=apache y group=apache 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 cambie su valor a lo siguiente.

...
listen.acl_users = apache,nginx,caddy
...

Guarde el archivo presionando Control + X y entrando 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 la carpeta html.

$ sudo nano /var/www/example.com/html/test.php

Agregue el siguiente contenido y guarde el archivo presionando Control + X y entrando Y Cuando se le solicite.

<?php phpinfo();

Inicie http://example.com/test.php en su navegador web y debería ver lo siguiente.

P√°gina de prueba de Caddy PHP

Configuración de proxy inverso

Caddy también se puede utilizar como servidor proxy inverso. Para configurarlo, utilice 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 le permite establecer 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, el correo electr√≥nico especifica la ID de correo electr√≥nico utilizada 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. La opci√≥n max_header_size 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 características 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 hacer eso.

$ caddy hash-password
Enter password:
Confirm password:
JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX

Una vez que tenga lista la contrase√Īa, ingrese el siguiente c√≥digo en su Caddyfile.

basicauth /secret/* {
	John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}

El comando anterior proteger√° el directorio /secret con las credenciales que acaba de crear.

Fortalecimiento de la seguridad del sitio y habilitación de 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

A√Ī√°dele 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.

  1. Habilita la compatibilidad con HSTS para el sitio y todos sus subdominios.
  2. Habilita el filtrado XSS.
  3. Evita la detección de contenido/MIME.
  4. Evita que tu sitio se cargue dentro de un IFRAME.
  5. Evita que su sitio se incluya en las pruebas de seguimiento de FLOC.
  6. Agrega una política de seguridad de contenido sobre cómo los agentes de usuario tratan las URL inseguras.
  7. 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.
  8. 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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *