Installare uno stack LAMP su Debian 13 e Debian 12: Apache2, PHP 8, MariaDB e phpMyAdmin

Pubblicato il Aggiornato il 7 min di lettura

Apache2, PHP 8, MariaDB e phpMyAdmin su Debian 13 oppure Debian 12: l'intera configurazione passo dopo passo, comprese la messa in sicurezza e la risoluzione degli errori.

Vuoi installare Apache2, PHP 8, un database MySQL e phpMyAdmin, quindi uno stack LAMP completo, sul tuo server Debian 13 (Trixie) oppure Debian 12 (Bookworm)? Questa guida ti accompagna passo dopo passo attraverso l'intera configurazione, dal server web fino all'accesso protetto al database.

Importante, riguardo al server di database: Debian non contiene alcun pacchetto mysql-server, in nessuna versione attuale. Su Debian installi sempre MariaDB. MariaDB nasce da MySQL, parla lo stesso protocollo e lo stesso linguaggio di interrogazione, e strumenti come phpMyAdmin oppure l'estensione PHP php-mysql continuano a funzionare senza alcuna modifica. Quando in questa guida si parla di database MySQL, sotto gira quindi MariaDB.

Requisiti

Ti serve un accesso SSH con permessi di root (oppure un utente con autorizzazione sudo) su una Debian aggiornata. Sono consigliate Debian 13 "Trixie" e Debian 12 "Bookworm". Debian 10 ha raggiunto la fine del supporto a giugno 2024 e non riceve più aggiornamenti di sicurezza regolari, quindi non è più adatta all'uso in produzione.

Aggiorna per prima cosa l'elenco dei pacchetti e installa gli aggiornamenti disponibili:

apt update

apt upgrade -y

Installare Apache2 e i pacchetti di base

Installa il server web insieme ai pacchetti di supporto che ti serviranno nei passaggi seguenti:

apt install -y nano curl wget unzip ca-certificates apt-transport-https lsb-release gnupg apache2

Apri poi nel browser l'indirizzo http://<IP-DEL-TUO-SERVER>/. Se compare la pagina predefinita di Apache2, il server web è già in funzione.

Installare PHP 8

Quale versione di PHP ottieni dai repository dipende dalla tua distribuzione. Per questo un comando con numero di versione fisso come apt install php8.4 fallisce su Debian 12, dove esiste soltanto PHP 8.2. Questa panoramica mostra la versione fornita in ciascun caso (dati di luglio 2026):

DistribuzioneVersione PHP dai repository
Debian 13PHP 8.4
Debian 12PHP 8.2
Debian 11PHP 7.4

Usa quindi i metapacchetti senza numero di versione. Richiamano automaticamente la versione adatta alla tua distribuzione e si comportano allo stesso modo su ogni Debian:

apt install -y php php-cli php-common php-curl php-gd php-intl php-mbstring php-mysql php-opcache php-readline php-xml php-zip php-bz2 libapache2-mod-php

Se preferisci far girare PHP tramite FPM invece che con il modulo Apache, vale lo stesso principio. Anche qui il metapacchetto porta al risultato in modo affidabile, mentre i nomi con numero di versione come php8.4-fpm esistono solo su Debian 13:

apt install -y php-fpm

Quale versione sia stata effettivamente installata te lo mostra:

php -v

Se ti serve una versione che la tua edizione di Debian non porta con sé (per esempio PHP 8.4 su Debian 12), aggiungi il repository PHP di Ondřej Surý. La chiave di firma viene installata tramite un pacchetto keyring dedicato e nella riga dei sorgenti viene associata con signed-by= esattamente a questo repository:

curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb

dpkg -i /tmp/debsuryorg-archive-keyring.deb

echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" | tee /etc/apt/sources.list.d/php.list

apt update

La strada un tempo molto diffusa tramite apt-key add è deprecata da Debian 11 e non andrebbe più utilizzata, perché una chiave registrata in quel modo varrebbe per tutti i repository del sistema.

Solo grazie a questo repository i nomi di pacchetto con numero di versione diventano disponibili su tutte le edizioni di Debian. A quel punto installi la versione PHP desiderata insieme alle estensioni consuete:

apt install -y php8.4 php8.4-cli php8.4-common php8.4-curl php8.4-gd php8.4-intl php8.4-mbstring php8.4-mysql php8.4-opcache php8.4-readline php8.4-xml php8.4-zip php8.4-bz2 libapache2-mod-php8.4

Se in seguito girano più versioni di PHP in parallelo, stabilisci quale deve usare Apache2:

a2dismod php8.2

a2enmod php8.4

systemctl restart apache2

Con php -v verifichi quale versione è attiva sulla riga di comando.

Installare e mettere in sicurezza MariaDB come server di database

Come già accennato all'inizio, su Debian non esiste alcun pacchetto mysql-server. Qui il server di database si chiama MariaDB, e precisamente in questa edizione a seconda della versione di Debian:

DistribuzioneServer di database dai repository
Debian 13MariaDB 11.8
Debian 12MariaDB 10.11
Debian 11MariaDB 10.5

Installa il server e avvia subito dopo la procedura di messa in sicurezza:

apt install -y mariadb-server mariadb-client

mysql_secure_installation

Lo script pone diverse domande. Le versioni recenti di MariaDB chiedono per prima cosa se passare all'autenticazione unix_socket. Questa opzione ha senso, perché così l'utente di database root può accedere soltanto come utente di sistema root. A tutte le altre domande (rimuovere gli utenti anonimi, vietare il login remoto per root, eliminare il database di test, ricaricare i permessi) rispondi ogni volta con y. Assegna inoltre una password di database robusta.

Verifica poi che il servizio sia attivo:

systemctl status mariadb

Installare phpMyAdmin

Per phpMyAdmin hai due possibilità. Il pacchetto phpmyadmin è presente nei repository di tutte le versioni Debian attuali e si installa in un solo passaggio:

apt install phpmyadmin -y

Comodo, ma la versione resta spesso indietro rispetto a quella del produttore. Chi vuole di volta in volta l'edizione più recente scarica invece phpMyAdmin direttamente. È proprio questa la strada descritta nei passaggi seguenti:

cd /usr/share && wget https://www.phpmyadmin.net/downloads/phpMyAdmin-latest-all-languages.zip -O phpmyadmin.zip && unzip phpmyadmin.zip && rm phpmyadmin.zip && mv phpMyAdmin-*-all-languages phpmyadmin && chmod -R 0755 phpmyadmin

Crea successivamente il file di configurazione:

cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

phpMyAdmin ha bisogno di un valore casuale come blowfish_secret, con cui vengono cifrati i dati di sessione nel cookie. Genera un valore di questo tipo:

openssl rand -base64 32

Inseriscilo poi nel file di configurazione:

nano /usr/share/phpmyadmin/config.inc.php

La riga interessata è questa:

$cfg['blowfish_secret'] = 'INSERISCI_QUI_IL_VALORE_GENERATO';

Collegare phpMyAdmin ad Apache2

Crea un file di configurazione Apache2 dedicato a phpMyAdmin:

nano /etc/apache2/conf-available/phpmyadmin.conf

Il contenuto per phpmyadmin.conf:

#Configurazione Apache2 per phpMyAdmin

Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
</Directory>

<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

Attiva la configurazione, ricarica Apache2 e crea la directory temporanea con i permessi corretti:

a2enconf phpmyadmin && systemctl reload apache2 && mkdir -p /usr/share/phpmyadmin/tmp/ && chown -R www-data:www-data /usr/share/phpmyadmin/tmp/

Creare un utente di database

Accedi al database come utente di sistema root:

mysql -u root

Crea ora un utente di database dedicato. Come nome non usare "root", "admin", "user" oppure "username", ma un nome utente personale e una password lunga e casuale:

#IMPORTANTE! SOSTITUISCI USER E PASSWORD CON LE TUE CREDENZIALI.

CREATE USER 'USER'@'localhost' IDENTIFIED BY 'PASSWORD';

GRANT ALL PRIVILEGES ON *.* TO 'USER'@'localhost' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Per le singole applicazioni conviene creare in aggiunta utenti con permessi limitati, che possano accedere solo al proprio database:

CREATE DATABASE miaapp;

CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'PASSWORD';

GRANT ALL PRIVILEGES ON miaapp.* TO 'appuser'@'localhost';

FLUSH PRIVILEGES;

Puoi uscire in qualsiasi momento dalla console del database con:

exit

Testare lo stack LAMP

Apri phpMyAdmin all'indirizzo http://<IP-DEL-TUO-SERVER>/phpmyadmin e accedi con l'utente appena creato. Se l'accesso riesce, Apache2, PHP e MariaDB lavorano insieme correttamente.

Il collegamento a PHP lo verifichi inoltre con un breve file di test:

echo "<?php phpinfo();" > /var/www/html/info.php

Dopo aver aperto http://<IP-DEL-TUO-SERVER>/info.php elimina assolutamente il file, perché rivela dettagli sulla configurazione del tuo server:

rm /var/www/html/info.php

Indicazioni di sicurezza per l'uso in produzione

Uno stack LAMP appena installato non è ancora messo in sicurezza. Questi punti andrebbero aggiunti:

  • phpMyAdmin è un bersaglio molto ambito. Limita l'accesso al tuo indirizzo IP, usando nel blocco Directory Require ip 203.0.113.10 al posto dell'apertura generalizzata.
  • Configura HTTPS, così le password non viaggiano in chiaro. Senza cifratura le tue credenziali sono leggibili lungo il percorso verso il server.
  • Mantieni phpMyAdmin aggiornato. Dato che lo hai installato manualmente, apt upgrade non lo aggiorna in automatico.
  • Crea backup regolari del database e conservali al di fuori del server.

Errori frequenti e soluzioni

Il browser scarica il file PHP invece di eseguirlo: il modulo PHP non è attivo in Apache2. Attivalo con a2enmod php8.4 e riavvia il server web con systemctl restart apache2.

phpMyAdmin segnala "The configuration file now needs a secret passphrase": in config.inc.php manca il valore per blowfish_secret. Generalo con openssl rand -base64 32 e inseriscilo nel file.

"Access denied for user" al momento del login in phpMyAdmin: dopo mysql_secure_installation l'utente di database root usa di norma l'autenticazione unix_socket e per questo non può accedere tramite l'interfaccia web. Utilizza l'utente creato in aggiunta.

Apache2 non parte più dopo una modifica alla configurazione: controlla la configurazione con apachectl configtest, l'output indica file e riga dell'errore.

Domande frequenti

Perché Debian installa MariaDB al posto di MySQL?
Debian non contiene in nessuna versione attuale un pacchetto chiamato mysql-server. Il server di database fornito è MariaDB, nato da MySQL e con lo stesso protocollo e lo stesso linguaggio di interrogazione. Debian 13 include MariaDB 11.8, Debian 12 la versione 10.11 e Debian 11 la versione 10.5.
Quale versione di PHP include Debian?
Debian 13 porta con sé PHP 8.4, Debian 12 PHP 8.2 e Debian 11 ancora PHP 7.4. Usa quindi i metapacchetti senza numero di versione, cioè php oppure php-fpm. Un comando con numero fisso come apt install php8.4 fallisce su Debian 12, dove quel pacchetto non esiste.
Come ottengo una versione di PHP più recente di quella di Debian?
Tramite il repository PHP di Ondřej Surý. La chiave di firma entra nel sistema come pacchetto keyring dedicato e viene associata con signed-by esattamente a quella fonte di pacchetti. Solo a quel punto sono disponibili su ogni edizione di Debian i nomi di pacchetto con numero di versione come php8.4-fpm.
Perché il browser scarica il file PHP invece di eseguirlo?
In questo caso il modulo PHP non è attivo in Apache2. Attivalo con a2enmod e il nome della tua versione di PHP, per esempio a2enmod php8.4, e riavvia poi Apache2 con systemctl restart apache2.
Perché non riesco ad accedere a phpMyAdmin come root?
Dopo aver eseguito mysql_secure_installation l'utente di database root usa di norma l'autenticazione unix_socket e per questo non può accedere tramite l'interfaccia web. Crea a questo scopo un utente di database dedicato.

LAMP Apache2 PHP MariaDB MySQL phpMyAdmin Debian 13 Debian