Caddy Web Server met PHP installeren en configureren op Fedora 34 / CentOS 8

Caddy is een open-source webserver geschreven in de taal Go. Het biedt HTTP/3 ondersteuning, TLS v1.3, automatische SSL configuratie met Let’s Encrypt, reverse proxy, en ondersteunt meerdere plugins om zijn functionaliteit uit te breiden. Het heeft het voordeel dat alle configuratie vanuit een enkel bestand wordt geserveerd, ongeacht het aantal sites dat je moet hosten.

Deze handleiding behandelt de installatie en configuratie van Caddy en PHP op Fedora 34 en CentOS 8 gebaseerde servers. We behandelen hoe je enkele en meerdere sites kunt hosten en hoe je reverse proxy kunt gebruiken, samen met enkele andere beveiligingsfuncties.

Vereisten

  • Fedora 34 of CentOS 8 gebaseerde server

  • Een niet-root gebruiker met sudo privileges

  • Een domeinnaam die naar het IP adres van de server wijst

  • SELinux is uitgeschakeld.

    $ sudo setenforce 0
    
  • Zorg ervoor dat alles bijgewerkt is.

    $ sudo dnf update
    

Stap 1 - Firewall instellen

De eerste stap is het instellen van de Firewall om HTTP en HTTPS poorten te openen. Fedora en CentOS worden geleverd met de Firewalld firewall voorgeïnstalleerd.

Controleer of de firewall draait.

$ sudo firewall-cmd --state

Je zou de volgende uitvoer moeten krijgen.

running

Controleer de huidige toegestane diensten/poorten.

$ sudo firewall-cmd --permanent --list-services

Het zou de volgende uitvoer moeten geven.

dhcpv6-client mdns ssh

Sta HTTP en HTTPS poorten toe.

$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https

Controleer de status van de firewall opnieuw.

$ sudo firewall-cmd --permanent --list-services

Je zou een gelijkaardige uitvoer moeten zien.

dhcpv6-client http https mdns ssh

Herlaad de firewall.

$ sudo systemctl reload firewalld

Stap 2 - Installeer Caddy

De eerste stap is het installeren van de server. De installatiestappen blijven hetzelfde voor zowel Fedora 34 als CentOS 8.

$ sudo dnf install 'dnf-command(copr)'
$ sudo dnf copr enable @caddy/caddy
$ sudo dnf install caddy

Je kunt de installatie controleren met het volgende commando.

$ caddy version
v2.4.3 h1:Y1FaV2N4WO3rBqxSYA8UZsZTQdN+PwcoOcAiZTM8C0I=

Stap 3 - Caddy configuratie basisprincipes

Caddy gebruikt JSON als het primaire formaat voor het opslaan of schrijven van configuratie. Het is de meest flexibele manier om de configuratie te schrijven en ondersteunt alle mogelijkheden van Caddy. Maar als je niet weet hoe je JSON bestanden moet schrijven, biedt Caddy een eenvoudiger manier in de vorm van Caddyfile.

Het Fedora / CentOS pakket bevat een Caddyfile op /etc/caddy/Caddyfile. Het zou er als volgt uit moeten zien (de opmerkingen negerend)

:80 {
        root * /usr/share/caddy
        file_server
}

Schakel de caddy daemon in en start hem.

$ sudo systemctl enable --now caddy

Je kunt de URL http://youripaddress openen om te controleren.Je zou de volgende welkomstpagina moeten zien.

Caddy Welkom Pagina

Caddy biedt vele mogelijkheden en configuraties, dus we gaan alleen in op de belangrijke om onze website te bedienen. De standaard configuratie serveert over HTTP, dat wordt opgegeven als :80. De root richtlijn vertelt Caddy om de te serveren bestanden te zoeken in de /usr/share/caddy directory.

De file_server richtlijn vertelt Caddy dat hij zich als een bestandsserver moet gedragen, wat betekent dat hij alleen statische bestanden zal serveren over het standaard adres.

Caddy instellen voor een basis HTML website

Laten we een basis caddy configuratiebestand maken om een statische website te serveren.

Maak een directory om je website te hosten en je logbestanden op te slaan.

$ sudo mkdir -p /var/www/example.com/html
$ sudo mkdir /var/log/caddy

Stel het eigendom van de directory in op Caddy.

$ sudo chown caddy:caddy /var/www/example.com/html -R
$ sudo chown caddy:caddy /var/log/caddy

Maak een HTML bestand om te testen en open het om te bewerken.

$ sudo nano /var/www/example.com/html/index.html

Voeg de volgende code toe.

<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1>Hello, from Caddy!</h1>
</body>
</html>

Druk op Ctrl + X om de editor te sluiten en druk op Y als gevraagd wordt om het bestand op te slaan.

Open het Caddy-bestand om het te bewerken.

$ sudo nano /etc/caddy/Caddyfile

Vervang de bestaande code door de volgende.

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]
}

Druk op Ctrl + X om de editor te sluiten en druk op Y wanneer je gevraagd wordt het bestand op te slaan.

Laten we alle directieven in het bestand doornemen. De encode gzip richtlijn vertelt Caddy de bestanden te comprimeren met Gzip compressie.

De log richtlijn voert het toegangslogboek voor de site uit naar het /var/log/caddy/example.access.log bestand. Standaard roteert Caddy de logbestanden wanneer ze 100 MB bereiken. De geroteerde bestanden worden gewist na 90 dagen of wanneer er meer dan 10 geroteerde logs zijn. Je kunt de standaard parameters op de volgende manier veranderen.

log {
    output file /var/log/caddy/example.access.log {
        roll_size 10MB
        roll_keep 5
        roll_keep_for 240h
    }
}

In de bovenstaande code worden de geroteerde logbestanden beperkt tot 10 MB en verwijderd na 10 dagen (240 uur) of wanneer er meer dan 5 geroteerde logs zijn.

Caddy genereert en installeert het SSL certificaat automatisch zonder enige interventie. De tls richtlijn maakt het mogelijk extra opties te geven om HTTPS in te stellen, zoals het e-mail adres dat gebruikt wordt voor het verkrijgen van Let's Encrypt rapporten.

De header richtlijn schakelt Cache-control in voor alle statische bestanden (afbeeldingen/javascript/CSS bestanden). Je kunt meer bestandsextensies toevoegen of de code kopiëren om voor verschillende bestandsformaten een andere duur in te stellen. Je zult de waarde static in iets anders moeten veranderen, want dat is een named reference.

Als je klaar bent, kun je je configuratie valideren met het volgende commando.

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

We moeten de optie --adapter caddyfile gebruiken omdat het commando standaard alleen JSON configuraties valideert.

Als je de volgende waarschuwing krijgt, kun je die met een enkel commando eenvoudig verhelpen.

WARN    input is not formatted with 'caddy fmt' {"adapter": "caddyfile", "file": "/etc/caddy/Caddyfile", "line": 2}

Voer het volgende commando uit om de fout te herstellen.

$ caddy fmt --overwrite /etc/caddy/Caddyfile

Het bovenstaande commando formatteert en overschrijft de Caddyfile.

Herstart Caddy om de configuratie in te schakelen. Telkens als je een verandering in de configuratie aanbrengt, moet je de server opnieuw starten.

$ sudo systemctl restart caddy

Open in je browser, en je zou de volgende pagina moeten zien, wat betekent dat de configuratie werkt.

Caddy FrontPage

Meerdere sites instellen in Caddy

Je kunt meerdere sites in een enkel caddy bestand instellen. Om dat te doen maak je voor elke site aparte blokken op de volgende manier.

example1.com {
	root * /var/www/example1.com/html
	...
}

example2.com {
	root * /var/www/example2.com/html
	...
}

Deze methode is prima voor een paar sites, maar een enkele kan behoorlijk groot worden en moeilijk te onderhouden als je meerdere sites host.

Maak de map `/etc/caddy/caddyconf.

$ sudo mkdir /etc/caddy/caddyconf

Nu kun je de configuratiebestanden uit de directory in je /etc/caddty/caddyfile bovenaan het bestand importeren.

import caddyconf/*.conf

De laatste stap is het maken van afzonderlijke configuratiebestanden voor elke site.

PHP sites instellen

Tot nu toe hebben we het alleen gehad over het serveren van statische sites met Caddy. Je kunt Caddy net zo gemakkelijk gebruiken om ook dynamische PHP sites te serveren. Om de PHP ondersteuning in te schakelen voeg je de volgende code toe binnen je site blok.

example1.com {
	root * /var/www/example1.com/html
	...
	php_fastcgi unix//run/php-fpm/www.sock
}

Je zult ook PHP moeten installeren.

$ sudo dnf install php-fpm php-cli php-gd

Je kunt elke extra PHP module installeren die je nodig hebt. Je zult ook het bestand /etc/php-fpm.d/www.conf moeten configureren . Open het bestand om het te bewerken.

$ sudo nano /etc/php-fpm.d/www.conf

We moeten de Unix gebruiker/groep van PHP processen instellen op caddy. Zoek de regels user=apache en group=apache in het bestand en verander ze in 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
...

Zoek de regel listen.acl_users = apache,nginx en verander de waarde in het volgende.

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

Sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

Start het PHP-fpm proces.

$ sudo systemctl start php-fpm

Om je PHP opstelling te testen maak je een bestand test.php in de map html.

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

Voeg er de volgende inhoud aan toe en sla het bestand op door op Ctrl + X te drukken en Y in te voeren als daarom gevraagd wordt.

<?php phpinfo();

Start http://example.com/test.php in je web browser, en je zou het volgende moeten zien.

Caddy PHP testpagina

Omgekeerde proxy instellen

Caddy kan ook als omgekeerde proxy server gebruikt worden. Om dat in te stellen gebruik je de volgende code.

example1.com {
	...
	reverse_proxy localhost:8000 {
		header_up Host {http.reverse_proxy.header.X-Forwarded-Host}
	}
}

Stap 4 - Caddy globale opties

In het Caddy bestand kun je enkele opties instellen die globaal van toepassing zullen zijn, d.w.z. dat ze voor al je sites zullen gelden. Het is gunstig om globale opties in te stellen, zodat je ze niet in elk serverblok opnieuw hoeft te declareren.

Je kunt de globale opties het beste helemaal bovenaan in je Caddyfile zetten. Er zijn een heleboel opties die je globaal kunt instellen. We zullen alleen enkele belangrijke doornemen. Voor de rest moet je de documentatie van Caddy raadplegen.

Hier zijn enkele standaard opties die je in je Caddyfile kunt gebruiken.

{	
	#TLS Options
	email [email protected]

	servers	:443 {
		protocol {
			experimental_http3
		}
		max_header_size 5mb
	}
	
	servers :80 {
		protocol {
			allow_h2c
		}
		max_header_size 5mb
	}
}

In de bovenstaande code email specificeer je het e-mail ID dat gebruikt wordt voor het registreren van het SSL certificaat bij de Let's Encrypt autoriteit. OCSP nieten verbetert de prestaties van HTTPS sites door automatisch certificaat revocatie informatie aan de browsers te geven. De optie max_header_size specificeert de grootte van de HTTP request headers van de cliënt die moeten worden geparseerd.

We hebben ook HTTP/3 protocol ingeschakeld voor HTTPS sites en HTTP/2 ondersteuning voor HTTP sites. Dit zijn experimentele mogelijkheden die waarschijnlijk uiteindelijk verwijderd zullen worden, dus wees voorzichtig voordat je ze inschakelt.

Stap 5 - De beveiliging verbeteren

HTTP authenticatie inschakelen

Je kunt eenvoudige HTTP authenticatie inschakelen voor bepaalde directories. Eerst moet je er authenticatie gegevens voor aanmaken.

Caddy accepteert in de configuratie alleen gehashte wachtwoorden. Je moet dus eerst een hashed wachtwoord aanmaken. Voer het volgende commando uit om dat te doen.

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

Als je het wachtwoord klaar hebt, voer je de volgende code in je Caddyfile in.

basicauth /secret/* {
	John JDJhJDEwJEVCNmdaNEg2Ti5iejRMYkF3MFZhZ3VtV3E1SzBWZEZ5Q3VWc0tzOEJwZE9TaFlZdEVkZDhX
}

Het bovenstaande commando zal de /secret directory beveiligen met de zojuist gemaakte credentials.

Site beveiliging harden en HSTS inschakelen

Er zijn nog andere beveiligingsconfiguraties die je kunt toevoegen om je sites te beschermen. Daarvoor maken we een ander bestand /etc/caddy/caddy_security.conf.

$ sudo nano /etc/caddy/caddy_security.conf

Voeg er de volgende code aan toe.

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'"
}

De bovenstaande code maakt/implementeert het volgende mogelijk.

  1. Schakelt HSTS ondersteuning in voor de site en al zijn subdomeinen.
  2. Schakelt XSS filtering in.
  3. Voorkomt Content/MIME Sniffing.
  4. Het voorkomt dat je site binnen een IFRAME geladen wordt.
  5. Het voorkomt dat je site wordt opgenomen in FLOC tracking proeven.
  6. Voegt een Content beveiligingsbeleid toe over hoe user agents onveilige URL's behandelen.
  7. Voert een referrer beleid in zodat alleen de referrer wordt gestuurd voor cross-origin verzoeken als het protocol dat ook zegt.
  8. Feature Policy verschaft een mechanisme om bepaalde browsereigenschappen in en uit te schakelen.

Importeer vervolgens het bestand in een van de site blokken die je wilt.

example.com {
	...
	import /etc/caddy/caddy_security.conf
}

Herstart de server om de verandering door te voeren.

Conclusie

Dit is het einde van de handleiding over het installeren en configureren van de Caddy webserver op Fedora 34 / CentOS 8 gebaseerde servers. Als je vragen hebt, stel ze dan in de commentaar hieronder.