Server Web · 11 min read · Nov 28, 2025
Come installare e configurare il server web Caddy con PHP e MariaDB su Ubuntu 20.04

Caddy Web Server è un moderno server web open-source scritto in linguaggio GO. Non ha dipendenze e funziona tramite un file binario statico, generando e rinnovando automaticamente i certificati SSL. Può funzionare come server di file statici, proxy inverso scalabile o potente server dinamico ed è espandibile tramite plugin. Include anche supporto per i protocolli HTTP/2 e HTTP/3 sperimentali.
In questo tutorial, installerai e configurerai Caddy per funzionare insieme a PHP e MariaDB su un server basato su Ubuntu 20.04.
Prerequisiti
- Un server Ubuntu 20.04 con un account non root che abbia privilegi sudo.
- Un nome di dominio completamente registrato puntato all’indirizzo IP del tuo server.
Passo 1 - Configurare il Firewall
Se stai usando UFW (Uncomplicated Firewall), devi configurarlo per consentire l’accesso alle porte HTTP e HTTPS affinché il server funzioni.
Controlla lo stato del firewall.
$ sudo ufw status
Dovresti vedere qualcosa di simile a quanto segue.
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Consenti le porte HTTP e HTTPS.
$ sudo ufw allow http
$ sudo ufw allow https
Controlla di nuovo lo stato per confermare.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443/tcp (v6) ALLOW Anywhere (v6)
Passo 2 - Installare Caddy
Ci sono diversi modi per installare Caddy, tra cui un’installazione docker, l’uso di repository ufficiali o la compilazione da sorgente. Il metodo di compilazione da sorgente è utile se desideri funzionalità che possono essere aggiunte solo tramite un modulo/plugin di terze parti.
Per il fine di questo tutorial, ci atteniamo all’uso del repository ufficiale di Caddy per sistemi basati su Ubuntu/Debian.
Aggiungi il repository alla lista.
$ echo "deb [trusted=yes] https://apt.fury.io/caddy/ /" | sudo tee -a /etc/apt/sources.list.d/caddy-fury.list
$ sudo apt update
Questo creerà un file di repository caddy nella directory /etc/apt/sources.list.d con la posizione del repository di Caddy.
Installa Caddy.
$ sudo apt install caddy
Questo installerà e avvierà automaticamente il server web Caddy. Apri http:// nel tuo browser e dovresti essere accolto dalla seguente pagina.

Passo 3 - Installare PHP
Installa il repository PHP di Ondrej.
$ sudo add-apt-repository ppa:ondrej/php
Installa PHP 7.4 insieme ad alcuni pacchetti aggiuntivi.
$ sudo apt install php-cli php-fpm php-mysql
Controlla se PHP funziona correttamente.
$ php --version
Dovresti vedere un output simile.
PHP 7.4.6 (cli) (built: May 14 2020 10:03:35) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
Passo 4 - Installare MariaDB
MariaDB è un sostituto diretto di MySQL, il che significa che i comandi per eseguire e gestire MariaDB sono gli stessi di quelli per MySQL.
Aggiungi il repository ufficiale di MariaDB. Puoi optare per uno specchio diverso che sia più vicino alla posizione del tuo server dalla pagina del repository di MariaDB.
$ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
$ sudo add-apt-repository 'deb [arch=amd64] http://mirror.lstn.net/mariadb/repo/10.4/ubuntu focal main'
Per installare MariaDB emetti il seguente comando.
$ sudo apt install mariadb-server
Controlla se MariaDB è stato installato correttamente.
$ mysql --version
Dovresti vedere il seguente output.
mysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Abilita il servizio MariaDB.
$ sudo systemctl enable mariadb
Passo 5 - Configurare MariaDB
Esegui il seguente comando per eseguire la configurazione predefinita, come impostare una password per root, rimuovere utenti anonimi, disabilitare il login remoto per root e rimuovere le tabelle di test.
$ sudo mysql_secure_installation
Con MariaDB 10.4, ora ti verrà chiesto di utilizzare la password di root o il plugin unix_socket. Il plugin unix_socket ti consente di accedere a MariaDB con le credenziali del tuo utente Linux. È considerato più sicuro, anche se avrai bisogno di un nome utente/password tradizionale per utilizzare app di terze parti come phpMyAdmin. Ci atteniamo all’uso del plugin unix_socket per questo tutorial. Puoi comunque utilizzare phpMyAdmin tramite qualsiasi utente specifico che crei per i tuoi database.
Premere Invio sceglie l’opzione predefinita (quella in maiuscolo, Y in questo caso).
NOTE: ESEGUIRE TUTTE LE PARTI DI QUESTO SCRIPT È RACCOMANDATO PER TUTTI I SERVER MariaDB IN USO PRODUTTIVO! PER FAVORE LEGGI OGNI PASSO ATTENTAMENTE!
Per accedere a MariaDB per proteggerlo, avremo bisogno della password attuale per l'utente root. Se hai appena installato MariaDB e non hai ancora impostato la password di root, dovresti semplicemente premere invio qui.
Inserisci la password attuale per root (premi invio per nessuna): [PREMI INVIO]
OK, password utilizzata con successo, procedendo...
Impostare la password di root o utilizzare il unix_socket assicura che nessuno possa accedere all'utente root di MariaDB senza la corretta autorizzazione.
Hai già protetto il tuo account root, quindi puoi rispondere in sicurezza 'n'.
Passare all'autenticazione unix_socket [Y/n] [PREMI INVIO]
Abilitato con successo!
Ricaricamento delle tabelle dei privilegi..
... Successo!
Hai già protetto il tuo account root, quindi puoi rispondere in sicurezza 'n'.
Cambiare la password di root? [Y/n] [RISPOSTA n]
... salto.
Per impostazione predefinita, un'installazione di MariaDB ha un utente anonimo, consentendo a chiunque di accedere a MariaDB senza dover avere un account utente creato per loro. Questo è inteso solo per testare e per rendere l'installazione un po' più fluida. Dovresti rimuoverli prima di passare a un ambiente di produzione.
Rimuovere utenti anonimi? [Y/n] [PREMI INVIO]
... Successo!
Normalmente, root dovrebbe essere autorizzato a connettersi solo da 'localhost'. Questo assicura che qualcuno non possa indovinare la password di root dalla rete.
Disabilitare il login remoto per root? [Y/n] [PREMI INVIO]
... Successo!
Per impostazione predefinita, MariaDB viene fornito con un database chiamato 'test' a cui chiunque può accedere. Questo è anche inteso solo per testare e dovrebbe essere rimosso prima di passare a un ambiente di produzione.
Rimuovere il database di test e l'accesso ad esso? [Y/n] [PREMI INVIO]
\- Rimozione del database di test...
... Successo!
\- Rimozione dei privilegi sul database di test...
... Successo!
Ricaricare le tabelle dei privilegi assicurerà che tutte le modifiche apportate finora abbiano effetto immediato.
Ricaricare le tabelle dei privilegi ora? [Y/n] [PREMI INVIO]
... Successo!
Pulizia...
Tutto fatto! Se hai completato tutti i passaggi sopra, la tua installazione di MariaDB dovrebbe ora essere sicura.
Grazie per aver utilizzato MariaDB!
Accedi alla shell SQL di MariaDB.
$ sudo mysql
Inserisci la tua password di root quando richiesto.
Crea un database di test e un utente con permessi di accesso. Sostituisci database e user con la tua scelta. Sostituisci password con una password forte.
CREATE DATABASE testdb;
CREATE USER 'user' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON testdb.* TO 'user';
Esci dalla shell MySQL.
exit
Passo 6 - Configurare Caddy
Caddy può essere configurato in diversi modi: chiamate API, file JSON o un Caddyfile. Il Caddyfile è il modo più semplice per configurare Caddy, che utilizzeremo nel nostro tutorial.
Prima di configurare Caddy, dobbiamo creare la directory radice per il nostro sito.
$ sudo mkdir -p /var/www/example.com/html
Il flag -p crea anche eventuali directory padre mancanti.
Dobbiamo anche creare una directory per memorizzare i file di log per Caddy.
$ sudo mkdir /var/log/caddy
Il server Caddy durante l’installazione crea un utente caddy che gestisce i suoi compiti. Dobbiamo dare i permessi alla directory di log affinché Caddy possa accedervi e scriverci.
$ sudo chown -R caddy:caddy /var/log/caddy
Durante l’installazione, Caddy ha generato un Caddyfile predefinito in /etc/caddy/Caddyfile. Aprilo.
$ sudo nano /etc/caddy/Caddyfile
Dovrebbe apparire qualcosa di simile a quanto segue.
# Il Caddyfile è un modo semplice per configurare il tuo server web Caddy.
#
# A meno che il file non inizi con un blocco di opzioni globali, la prima
# riga non commentata è sempre l'indirizzo del tuo sito.
#
# Per utilizzare il tuo nome di dominio (con HTTPS automatico), prima assicurati
# che i record DNS A/AAAA del tuo dominio siano correttamente puntati a
# l'IP pubblico di questa macchina, quindi sostituisci la riga qui sotto con il tuo
# nome di dominio.
:80
# Imposta questo percorso sulla directory del tuo sito.
root * /usr/share/caddy
# Abilita il server di file statici.
file_server
# Un altro compito comune è impostare un proxy inverso:
# reverse_proxy localhost:8080
# Oppure servire un sito PHP tramite php-fpm:
# php_fastcgi localhost:9000
# Consulta la documentazione di Caddy per ulteriori informazioni:
# https://caddyserver.com/docs/caddyfile
:80 dice a Caddy di servire tutto sulla porta numero 80. root imposta il percorso per la directory principale del tuo sito. file_server abilita Caddy a funzionare come server di file statici.
Sostituisci il codice sopra con il seguente codice.
{
experimental_http3
}
example.com {
root * /var/www/example.com/html
log {
output file /var/log/caddy/example.com.access.log {
roll_size 3MiB
roll_keep 5
roll_keep_for 48h
}
format console
}
encode gzip zstd
php_fastcgi unix//run/php/php7.4-fpm.sock
tls [email protected] {
protocolli tls1.2 tls1.3
}
}
Esaminiamo tutte le sezioni del Caddyfile qui sotto.
- Il primo blocco in qualsiasi Caddyfile è un blocco globale a meno che tu non specifichi un nome host, che diventa quindi un blocco sito. Un blocco globale contiene direttive che vengono applicate a tutti i siti che ospiti sotto il server. Nel nostro esempio, abbiamo abilitato il supporto per il protocollo HTTP/3 sperimentale. Il blocco globale è completamente opzionale e puoi sempre iniziare il tuo Caddyfile direttamente con il blocco sito.
- Il blocco successivo è il blocco sito. Se hai solo 1 sito sul tuo server, non è necessario racchiudere la tua configurazione in un blocco, ma se intendi ospitare più siti, dovresti ospitare la configurazione di ciascun sito nel proprio blocco. Un blocco sito è contrassegnato da parentesi graffe. Ogni blocco sito inizia con il nome host del sito.
logabilita e configura la registrazione delle richieste HTTP. Senza la direttivalog, Caddy non registrerà nulla.outputconfigura dove scrivere il file di log.formatdescrive come codificare o formattare i log. Ilconsoleformatta l’entrata del log per la leggibilità umana.- La direttiva
encodequi abilita la compressione Gzip e Zstandard per il sito. php_fastcgiinoltra le richieste a un server PHP FastCGI comephp-fpm. Qui stiamo ascoltando le richieste su un socket Unix.- Il blocco
tlsconfigura le impostazioni relative ai certificati SSL e alla sicurezza. Qui, abbiamo abilitato il supporto per i protocolli TLSv1.2 e TLSv1.3. Per impostazione predefinita, Caddy supporta TLS v1.2 out of the box. Caddy genera anche certificati SSL automaticamente per tutti i siti. Se non vuoi che Caddy generi SSL per te, puoi farlo utilizzando l’indirizzo IP invece del nome host o specificando l’URL completo, cioè http://example.com. In tali casi, Caddy non genererà il certificato SSL.
Finora abbiamo coperto le basi assolute della scrittura di un Caddyfile che dovrebbe aiutarti a iniziare. Puoi leggere di più nella documentazione ufficiale.
Passo 7 - Configurare PHP
Ora che il nostro Caddyfile è pronto, è tempo di configurare PHP.
Per prima cosa, dobbiamo cambiare il nome utente per il processo PHP. Apri il file /etc/php-fpm.d/www.conf.
$ sudo nano /etc/php/7.4/fpm/pool.d/www.conf
Trova le righe user=www-data e group=www-data nel file e cambiale in caddy.
...
; Utente/gruppo Unix dei processi
; Nota: L'utente è obbligatorio. Se il gruppo non è impostato, verrà utilizzato il gruppo dell'utente predefinito
; RPM: utente apache scelto per fornire accesso alle stesse directory di httpd
user = caddy
; RPM: Mantieni un gruppo autorizzato a scrivere nella directory di log.
group = caddy
...
Inoltre, trova le righe listen.owner=www-data e listen.group=www-data nel file e cambiale in caddy.
listen.owner = caddy
listen.group = caddy
Salva il file premendo Ctrl+X e inserendo Y quando richiesto.
Riavvia il processo PHP-fpm.
$ sudo systemctl restart php7.4-fpm
Passo 8 - Lanciare il Sito Demo
Ora che abbiamo creato un Caddyfile e configurato PHP per funzionare con il server, è tempo di creare e lanciare un sito web demo.
Assicurati che il tuo nome di dominio sia puntato all’indirizzo IP del server.
Riavvia il server Caddy per applicare le modifiche nel Caddyfile che abbiamo creato sopra.
$ sudo systemctl restart caddy
Controlla lo stato del server Caddy per assicurarti che funzioni correttamente.
$ sudo systemctl status caddy
? caddy.service - Caddy
Loaded: loaded (/lib/systemd/system/caddy.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-20 07:09:25 UTC; 2s ago
Docs: https://caddyserver.com/docs/
Main PID: 25410 (caddy)
Tasks: 7 (limit: 1074)
Memory: 17.8M
CGroup: /system.slice/caddy.service
??25410 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO][example.com] Obtain: Lock acquired; proceeding...
May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO][cache:0xc0006f8cd0] Started certificate maintenance routine
May 20 07:09:25 example.com caddy[25410]: 2020/05/20 07:09:25 [INFO] acme: Registering account for [email protected]
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO][example.com] Waiting on rate limiter...
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO][example.com] Done waiting
May 20 07:09:26 example.com caddy[25410]: 2020/05/20 07:09:26 [INFO] [example.com] acme: Obtaining bundled SAN certificate given a CSR
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/4696123289
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] acme: use tls-alpn-01 solver
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 [INFO] [example.com] acme: Trying to solve TLS-ALPN-01
May 20 07:09:27 example.com caddy[25410]: 2020/05/20 07:09:27 http: TLS handshake error from 127.0.0.1:39466: EOF
Puoi vedere qui sopra che Caddy ha generato automaticamente il certificato quando abbiamo riavviato per la prima volta il server dopo aver creato il Caddyfile.
Creiamo una pagina di test per verificare che Caddy possa eseguire PHP e connettersi al database MariaDB.
$ sudo nano /var/www/example.com/html/test.php
Incolla il seguente codice nell’editor. Sostituisci i campi `
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.