#howto - Installazione e configurazione di Caddy Server su 2 Centos 8/RHEL 8/Fedora 31+
Caddy è un Web Server altamente estensibile e performante scritto in linguaggio Go.
Il beneficio nell’usare Caddy non è esclusivamente legato all’incremento di performance, ma nel godere di tutti i pregi di un software scritto in un linguaggio moderno, pulito e alla base di nuove tecnologie.
Un altro aspetto importante di questo web server è la configurazione automatizzata del certificato SSL, il quale è diventato un aspetto fondamentale per il web dei nostri giorni.
Installazione
Prima di tutto è bene accertarsi di aver installato curl dato che ci servirà per impartire istruzioni a Caddy (via API):
dnf install curl
L’installazione avviene tramite l’utilizzo di repository/build Copr di Fedora.
Per prima cosa aggiungiamo la repository Copr ufficiale di caddy, su Centos 8/RHEL 8:
yum-config-manager --add-repo https://copr.fedorainfracloud.org/coprs/g/caddy/caddy/repo/epel-7/group_caddy-caddy-epel-7.repo
mentre su Fedora 31+:
dnf copr enable @caddy/caddy
infine installiamo il pacchetto via dnf:
dnf install caddy
Una volta installato, possiamo abilitare il servizio all’avvio di sistema con systemctl:
systemctl enable caddy
Utilizzo del servizio
Come ogni web server, anche caddy mette a disposizione un servizio per avviare e fermare il processo. È possibile comunicare con questo sia tramite comando caddy
che via systemctl
.
Avvio
Per avviare il servizio possiamo usare l’opzione start
:
caddy start
o via systemctl:
systemctl start caddy
il quale lavorerà in background lasciando all’amministratore l’accesso alla console. Possiamo invece usare l’opzione run
per avviare il servizio tenendo impegnata la console e mostrandone il log:
caddy run
Stop
Usando l’opzione stop
possiamo fermare il servizio:
caddy stop
o via systemctl:
systemctl stop caddy
nel caso di una sessione eseguita via opzione run
, ci basterà inoltrare la combinazione di tasti CTRL+C
per fermarlo.
Reload
Un’altra opzione è reload
il quale (come su Nginx) si occupa di aggiornare e quindi ricaricare le configurazioni in uso:
caddy reload
Configurazione
Esistono due modi per configurare caddy, il primo sfruttando le API e comunicando mediante curl, la seconda tramite Caddyfile e lavorando con i comandi integrati.
Personalmente consiglio l’utilizzo dei Caddyfile non solo per la loro semplicità ma per poter sfruttare la conversione in tempo reale, passando il compito a caddy stesso.
API
La comunicazione tramite API (che avviene sulla porta 2019), torna utile in un contesto in cui si vuole automatizzare la distribuzione delle configurazioni. In un ambiente in produzione, in un contesto professionale, è consigliabile utilizzare i Caddyfile che spiegheremo nella prossima sezione.
Creiamo la nostra prima configurazione in un file json:
nano myconf.json
col seguente contenuto:
{
"apps": {
"http": {
"servers": {
"example": {
"listen": [":2015"],
"routes": [
{
"handle": [{
"handler": "static_response",
"body": "Ciao!"
}]
}
]
}
}
}
}
}
dove:
- example è la configurazione del server che stiamo creando
- listen è la porta da cui possiamo accedere
- routes è la lista di percorsi (in Nginx locations) a cui andiamo ad aggiungere definizioni specifiche come ad esempio un testo personalizzato da mostrare nel body della pagina, la quale verrà servita come una risorsa statica static_response
Inviamo la nostra nuova configurazione a caddy:
curl localhost:2019/load \
-X POST \
-H "Content-Type: application/json" \
-d @myconf.json
Ciò che abbiamo appena fatto è stato comunicare con caddy inviando una richiestra POST alle API col documento json contenente la nostra configurazione, il tutto tramite curl.
Testiamo quindi la nostra nuova configurazione con una nuova richiesta, questa volta di tipo GET:
curl localhost:2019/config/
se tutto è andato a buon fine dovremmo ricevere come output il testo che abbiamo precedentemente inserito come body, ossia Ciao!
.
Caddyfile
Creiamo un nuovo file di nome Caddyfile col seguente contenuto:
:2015
respond "Ciao!"
il quale ha lo stesso significato della precedente configurazione in json:
- :2015 è la porta da cui si potrà accedere alla risorsa, inserendo un dominio senza dichiarare la porta questa configurazione verrà vincolata al dominio specificato e servita sulla porta 80
- respond è il contenuto che andremo a mostrare nel body
fermiamo caddy nel caso fosse ancora operativo (CTRL+C
) ed avviamolo sfruttando il nostro file:
caddy run --config /posizione/Caddyfile --adapter caddyfile
dove:
- –config richiede la posizione completa al nostro Caddyfile
- –adapter specifica che caddy dovrà usare una configurazione in formato caddyfile e di conseguenza procedere in modo autonomo alla conversione in formato json
Proviamo nuovamente a visualizzare il contenuto del nostro sito:
curl localhost:2015
il quale dovrà mostrare Ciao!
nel caso fosse tutto configurato correttamente.
Domini multipli
Questa sezione tratta l’utilizzo di Caddy in un contesto professionale. Vedremo come preparare una struttura che supporti più configurazioni e quindi più domini ed applicativi web.
Normalmente il Caddyfile principale è posizionato in /etc/caddy/Caddyfile
, questo è il file di configurazione principale.
Per servire più domini e quindi più configurazioni, possiamo includere un percorso dinamico, sostituendo l’intero contenuto con:
import /etc/caddy/web/*/Caddyfile
creiamo quindi il percorso /etc/caddy/web
e al suo interno creiamo un percorso per il nostro primo dominio, ad esempio ilmiosito.ex :
mkdir -p /etc/caddy/web/ilmiodominio.ex
e creiamo al suo interno il Caddyfile:
nano /etc/caddy/web/ilmiodominio.ex/Caddyfile
al suo interno inseriamo il contenuto:
ilmiosito.ex {
root * /etc/caddy/web/ilmiosito.ex/public
try_files .html
file_server
}
creiamo il percorso public
:
mkdir -p /etc/caddy/web/ilmiodominio.ex/public
ed al suo interno un file index.html
con un contenuto di prova:
echo "<h1>Caddy!</h1>" > /etc/caddy/web/ilmiodominio.ex/public/index.html
visitando il dominio ilmiodominio.ex/index.html
riceveremo come output il contenuto inserito.
Eliminare estensione .html
Per siti web statici possiamo decidere di rendere disponibili i file .html
anche omettendo l’estensione, per fare ciò dobbiamo modificare l’opzione try_files:
try_files {path}.html {path}
Routing Vue.js
Per applicazioni in Vue è necessario istruire caddy sull’utilizzo del routing. Per fare questo possiamo modificare l’opzione try_files nel seguente modo:
try_files {path} /index.html
Supporto PHP
Abbiamo scritto una guida su questo argomento, disponibile qui.
Consiglio di proseguire la lettura tramite la documentazione ufficiale, nello specifico al punto Caddyfile.