Ubuntu 22.04 Server / Come installare Apache, PHP e MariaDB
Su Ubuntu 22.04 Server puoi preparare un ambiente Web di base installando Apache, il relativo modulo PHP, MariaDB e l’estensione PHP per il database. Dopo l’installazione, separa l’account amministrativo di MariaDB da quello dell’applicazione e verifica che PHP possa leggere un valore dal database.
Ambito dell’installazione e pacchetti
Questa guida esegue Apache e MariaDB su un unico server nuovo usando i repository predefiniti di Ubuntu 22.04. Servono privilegi sudo e una connessione Internet per scaricare i pacchetti. Su un server esistente, salva prima una copia della configurazione Web e dei database e controlla che i nomi di file, account e database dell’esempio siano disponibili. Se usi già PHP-FPM, non mescolare questa configurazione del modulo Apache con quella attuale.
- Aggiorna l’indice dei pacchetti e installa i componenti.
libapache2-mod-phpgestisce PHP in Apache, mentrephp-mysqlfornisce le estensioni per accedere a MariaDB. Installa anchephp-cliper i controlli da riga di comando. Consulta la guida Ubuntu all’installazione di PHP per questa configurazione.
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- Avvia i servizi e abilitali all’avvio del sistema. Verifica che il controllo della configurazione Apache mostri
Syntax OK, quindi riavvia Apache per caricare il modulo PHP.
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
L’ultimo comando mostra active per ogni servizio in esecuzione. Controlla le versioni installate con apache2 -v, php -v e mariadb --version. Repository aggiuntivi possono fornire una versione PHP diversa da quella dei repository predefiniti.
Verificare l’autenticazione amministrativa di MariaDB
I pacchetti MariaDB predefiniti di Ubuntu usano generalmente l’autenticazione tramite socket Unix per l’amministrazione locale. Questo metodo controlla l’identità dell’utente del sistema operativo: non significa che chiunque possa accedere con una password root vuota. Apri la sessione amministrativa seguente per esaminare l’account e la configurazione attuali.
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
L’autenticazione di root può variare in base alle impostazioni esistenti. Questo esempio mantiene l’autenticazione socket e crea un account applicativo separato, secondo la spiegazione dell’autenticazione MariaDB dalla versione 10.4. Non eseguire un UPDATE diretto del valore plugin in mysql.user e non usare root in un’applicazione Web.
Lo strumento seguente permette di esaminare le impostazioni di sicurezza iniziali. Testo e ordine delle domande dipendono dalla versione e dalla configurazione: non rispondere automaticamente Y a tutto.
sudo mariadb-secure-installation
- Se amministri già MariaDB con autenticazione socket, puoi mantenerla. La documentazione ufficiale dello strumento MariaDB spiega che normalmente non occorre impostare una nuova password root in questa configurazione.
- Su un server nuovo è opportuno rimuovere gli utenti anonimi e il database test non necessario e limitare l’accesso remoto di root. Se esistono servizi, controlla se usano queste risorse prima di decidere. Applica le modifiche quando viene proposto di ricaricare le tabelle dei privilegi.
Creare un database e un account dedicati all’applicazione
Connettiti di nuovo con sudo mariadb --protocol=socket ed esegui l’SQL seguente. lampdemo e lamp_app sono nomi nuovi per questa esercitazione. Se esistono già, scegline altri e adatta coerentemente gli esempi successivi; non sovrascrivere né eliminare oggetti esistenti. Sostituisci il segnaposto della password con una password lunga e unica e usa lo stesso valore nella configurazione PHP. Le password con apici singoli devono rispettare separatamente le regole di escape delle stringhe SQL e PHP.
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
L’amministratore crea la tabella; all’applicazione vengono concessi solo i permessi di lettura, inserimento, aggiornamento ed eliminazione su questo database. Se un programma di installazione deve creare tabelle, valuta tale permesso separatamente. Dopo l’assegnazione dei permessi con GRANT, non serve un ulteriore FLUSH PRIVILEGES.
Esegui la query dal terminale con l’account dell’applicazione e verifica che compaia database-ok. Non scrivere la password dopo -p: inseriscila quando richiesta.
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
Creare i file PHP dell’esempio di integrazione
La directory dei documenti Web del sito Apache predefinito di Ubuntu è normalmente /var/www/html. Per un host virtuale esistente, esamina sudo apache2ctl -S e la sua impostazione DocumentRoot, poi adatta il percorso del file Web. Se un file indicato esiste già, usa un altro nome. Conserva la configurazione contenente la password fuori dalla directory Web.
- Crea la directory di configurazione e apri un editor. I permessi seguenti presuppongono che Apache usi l’utente e il gruppo predefiniti di Ubuntu,
www-data.
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
Salva tutto il contenuto seguente in /etc/lamp-demo/database.php. Sostituisci password con la password dell’applicazione impostata prima. Come spiega la documentazione PHP sulla connessione PDO_MYSQL, host=localhost usa un socket su Unix. Passare a 127.0.0.1 seleziona TCP e può cambiare la corrispondenza dell’account e i requisiti di connessione.
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- Mantieni root come proprietario della configurazione e consenti la lettura solo al proprietario e al gruppo Apache. Apri quindi il file Web di verifica.
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
Salva tutto il contenuto seguente in /var/www/html/lamp-check.php. PDO (PHP Data Objects) è un’interfaccia per accedere ai database da PHP. Il codice controlla il valore effettivo della tabella prima di mostrare il successo. In caso di errore restituisce HTTP 500 con un messaggio generico e registra la causa dettagliata nel log del server.
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Assegna permessi di lettura al file Web e controlla la sintassi PHP di entrambi i file.
No syntax errors detectedconferma soltanto la sintassi, non una connessione riuscita al database.
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
Un utente normale potrebbe non poter leggere la configurazione, quindi il controllo di sintassi di quel file usa sudo. Non occorre rendere scrivibile l’intera directory Web né applicare chmod 777.
Verificare la risposta HTTP e la connessione al database
Richiedi l’URL seguente dal server stesso. Se manca curl, installalo con sudo apt install curl. Lo stato HTTP 200 e le due righe seguenti nel corpo della risposta indicano che Apache ha eseguito PHP e PHP ha letto la riga di esempio da MariaDB.
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
Da un altro computer, apri http://SERVER-IP/lamp-check.php nel browser. Per un host virtuale, usa il nome host configurato. Vedere solo la pagina iniziale predefinita o eseguire php -v non verifica questa integrazione.
Se l’accesso locale funziona ma da un altro computer no, controlla sudo ufw status verbose, i gruppi di sicurezza cloud e il routing. In una rete privata di prova con UFW già attivo, la regola seguente permette HTTP sulla porta 80 solo dalla sottorete prevista. Sostituisci 192.168.10.0/24 con la tua sottorete attendibile. Non disattivare il firewall e non attivarlo per la prima volta senza consentire SSH remoto per questa prova.
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHP e MariaDB comunicano tramite socket sullo stesso server, quindi non serve esporre la porta 3306. Svolgi l’esercizio HTTP in un ambiente attendibile. Prima di trasmettere credenziali o altri dati in produzione, configura separatamente dominio, host virtuale e certificato HTTPS.
Diagnosticare gli errori e ripulire i test
Per isolare i problemi di connessione, controlla nell’ordine servizi, moduli PHP, account e permessi dei file. I comandi seguenti mostrano configurazione e moduli Apache e i log recenti di entrambi i servizi. I log possono contenere informazioni operative: non pubblicarli senza esaminarli.
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- Il sorgente PHP viene mostrato o scaricato: interrompi l’accesso pubblico e verifica che il modulo PHP Apache sia attivo e Apache sia stato riavviato. Se l’installazione di
libapache2-mod-phpnon risolve il problema, esamina anche PHP-FPM e gli host virtuali esistenti. - could not find driver: verifica che l’estensione
php-mysqlcorrispondente alla versione PHP usata da Apache sia installata e attiva, poi riavvia Apache. PHP da terminale e PHP in Apache possono avere configurazioni diverse. - Access denied: controlla la password applicativa, l’account
'lamp_app'@'localhost'e i relativi permessi. Non cambiare l’autenticazione di root e non concedere privilegi globali per aggirare l’errore. Se manca il socket, confronta il risultato MariaDB diSHOW VARIABLES LIKE 'socket';con la configurazione socket di PHP. - Permission denied o 404: verifica che l’utente Apache possa leggere la configurazione e che il file Web sia nel DocumentRoot del sito richiesto. Controlla anche i permessi di accesso alla directory
/etc/lamp-demo.
Al termine, elimina con il comando seguente solo il file Web di prova creato in questa guida e verifica che lo stesso URL non restituisca più il messaggio di successo. Non lasciare file che espongono l’ambiente, come un phpinfo.php già presente. Se un’applicazione reale usa la configurazione, mantienila fuori dalla directory Web con permessi limitati.
sudo rm -- /var/www/html/lamp-check.php
Per eliminare anche i dati dell’esercitazione, controlla prima che nessun altro servizio li utilizzi, quindi esegui l’SQL seguente in una sessione amministrativa. Eliminare un database è irreversibile: salva prima i dati necessari. Applica i comandi solo ai nomi creati per questa esercitazione.
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
In una configurazione sullo stesso server, mantieni il binding locale di MariaDB. Se serve separatamente un accesso remoto al database, non rimuovere semplicemente bind-address: progetta insieme indirizzo di ascolto, origini consentite, account dedicato e connessione cifrata.



