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 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.
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.
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.
- Schakelt HSTS ondersteuning in voor de site en al zijn subdomeinen.
- Schakelt XSS filtering in.
- Voorkomt Content/MIME Sniffing.
- Het voorkomt dat je site binnen een IFRAME geladen wordt.
- Het voorkomt dat je site wordt opgenomen in FLOC tracking proeven.
- Voegt een Content beveiligingsbeleid toe over hoe user agents onveilige URL's behandelen.
- Voert een referrer beleid in zodat alleen de referrer wordt gestuurd voor cross-origin verzoeken als het protocol dat ook zegt.
- 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.