Server e reti

Installare un server LAMP su Fedora

Guida tecnica con Apache, PHP e MariaDB

Questo articolo è pensato come approfondimento tecnico della guida pubblicata su MST-Tutorial.it e descrive l’installazione e la configurazione di un server LAMP su Fedora. L’obiettivo non è soltanto installare i pacchetti necessari, ma comprendere il ruolo dei singoli componenti, verificare il corretto funzionamento dei servizi e preparare una base stabile per ospitare applicazioni web dinamiche.

Cos’è un server LAMP

Con il termine LAMP si indica uno stack software composto da Linux, Apache, MySQL o MariaDB e PHP. La lettera L rappresenta il sistema operativo GNU/Linux, in questo caso Fedora; la A indica Apache HTTP Server, cioè il servizio incaricato di ricevere le richieste HTTP/HTTPS e restituire pagine web; la M identifica il database relazionale, generalmente MySQL o MariaDB; la P rappresenta PHP, linguaggio di scripting lato server molto utilizzato per generare contenuti dinamici.

Un server LAMP permette di eseguire siti web statici, applicazioni dinamiche, pannelli amministrativi, blog, CMS, gestionali, aree riservate, API backend e ambienti di sviluppo locali. È una soluzione molto diffusa perché utilizza componenti open source, facilmente installabili tramite il gestore pacchetti della distribuzione e ampiamente documentati.

Su Fedora, Apache è distribuito con il nome del pacchetto httpd, mentre per il database viene spesso utilizzato MariaDB, compatibile con gran parte degli scenari MySQL. PHP viene integrato con Apache tramite i moduli e i servizi necessari per interpretare i file .php e dialogare con il database.

Schema dei componenti principali

Componente        Ruolo tecnico                         Pacchetto Fedora
Linux             Sistema operativo                     Fedora
Apache            Web server HTTP/HTTPS                 httpd
PHP               Linguaggio server-side                php, php-cli, php-fpm
MySQL/MariaDB     Database relazionale                  mariadb-server
PHP-MySQL         Driver PHP per database MySQL/MariaDB php-mysqlnd
Firewall          Gestione porte di rete                firewalld

Prerequisiti

Prima di procedere è consigliabile disporre di un sistema Fedora aggiornato, accesso a un utente con privilegi amministrativi tramite sudo e connessione Internet attiva. L’installazione può essere eseguita sia su Fedora Server sia su Fedora Workstation, ad esempio per creare un ambiente di test locale.

Nel caso di un server esposto in rete, è opportuno conoscere anche l’indirizzo IP della macchina, il nome host, l’eventuale dominio associato e le regole firewall applicate dal provider o dal router.

Verifica versione Fedora:
cat /etc/fedora-release

Verifica utente corrente:
whoami

Verifica indirizzo IP:
ip a

Aggiornamento del sistema

Il primo passaggio consiste nell’aggiornare l’elenco dei pacchetti e installare eventuali aggiornamenti disponibili. Questo riduce il rischio di incompatibilità e consente di partire da un sistema coerente.

sudo dnf update -y

Al termine dell’aggiornamento, se vengono installati nuovi kernel o librerie di sistema importanti, può essere utile riavviare la macchina prima di proseguire.

sudo reboot

Installazione di Apache, PHP e MariaDB

Su Fedora è possibile installare i componenti principali dello stack LAMP con un unico comando. Il pacchetto httpd installa Apache, php e i relativi pacchetti abilitano l’esecuzione di script PHP, mentre mariadb-server installa il database server compatibile con MySQL.

sudo dnf install -y httpd php php-cli php-fpm php-mysqlnd mariadb-server

Per molti CMS e applicazioni web moderne possono essere utili anche estensioni PHP aggiuntive, ad esempio per gestire immagini, stringhe multibyte, file compressi, internazionalizzazione e XML.

sudo dnf install -y php-gd php-mbstring php-xml php-json php-intl php-zip php-opcache

Avvio e abilitazione di Apache

Dopo l’installazione, Apache deve essere avviato e abilitato all’avvio automatico del sistema. Su Fedora il servizio si chiama httpd.

sudo systemctl enable --now httpd

Per verificare lo stato del servizio:

systemctl status httpd

Se il servizio è attivo, il browser dovrebbe mostrare la pagina predefinita di Apache visitando l’indirizzo locale:

http://localhost

Da un altro dispositivo della stessa rete si può invece usare l’indirizzo IP del server:

http://INDIRIZZO_IP_DEL_SERVER

Directory principale del sito

La directory predefinita in cui Apache cerca i file web è:

/var/www/html/

Per creare una semplice pagina HTML di prova:

echo "<h1>Server LAMP Fedora funzionante</h1>" | sudo tee /var/www/html/index.html

Il file sarà raggiungibile visitando:

http://localhost/index.html

Test di PHP

Per verificare che PHP venga interpretato correttamente da Apache, è possibile creare un file di test nella document root.

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

Dopo la creazione del file, riavviare Apache:

sudo systemctl restart httpd

Aprire quindi il browser all’indirizzo:

http://localhost/info.php

Se la configurazione è corretta, verrà mostrata la pagina informativa di PHP. Questa pagina è molto utile in fase di test perché mostra versione di PHP, moduli caricati, percorsi di configurazione e variabili del server. Tuttavia, su un server pubblico deve essere rimossa subito dopo la verifica, perché espone informazioni tecniche sensibili.

sudo rm /var/www/html/info.php

Avvio e protezione di MariaDB

Il database server deve essere avviato e abilitato all’avvio automatico.

sudo systemctl enable --now mariadb

Per controllare lo stato del servizio:

systemctl status mariadb

Dopo l’avvio è consigliabile eseguire la procedura di configurazione sicura. Questa operazione consente di impostare o modificare la password amministrativa, rimuovere utenti anonimi, disabilitare accessi remoti non necessari e rimuovere database di test.

sudo mariadb-secure-installation

Creazione di database e utente applicativo

Per motivi di sicurezza, un’applicazione web non dovrebbe usare direttamente l’utente amministrativo del database. È preferibile creare un database dedicato e un utente con privilegi limitati a quel solo database.

sudo mariadb
CREATE DATABASE sito_lamp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'utente_lamp'@'localhost' IDENTIFIED BY 'PasswordMoltoSicura';

GRANT ALL PRIVILEGES ON sito_lamp.* TO 'utente_lamp'@'localhost';

FLUSH PRIVILEGES;

EXIT;

In questo esempio il database si chiama sito_lamp, mentre l’utente applicativo è utente_lamp. La connessione è limitata a localhost, quindi l’utente potrà collegarsi solo dal server stesso.

Test di connessione PHP al database

Dopo aver creato database e utente, si può verificare la connessione tramite un piccolo script PHP. Il seguente esempio usa PDO, interfaccia consigliata perché permette di gestire in modo ordinato connessioni, errori e query preparate.

sudo nano /var/www/html/db-test.php
<?php
$host = 'localhost';
$dbname = 'sito_lamp';
$user = 'utente_lamp';
$password = 'PasswordMoltoSicura';

try {
    $pdo = new PDO(
        "mysql:host=$host;dbname=$dbname;charset=utf8mb4",
        $user,
        $password,
        [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
        ]
    );

    echo "Connessione al database riuscita.";
} catch (PDOException $e) {
    echo "Errore di connessione al database.";
}
?>

Aprire quindi:

http://localhost/db-test.php

Anche questo file dovrebbe essere rimosso dopo il test, soprattutto se il server è accessibile dalla rete.

sudo rm /var/www/html/db-test.php

Configurazione del firewall

Fedora utilizza normalmente firewalld per la gestione del firewall. Se il server deve essere raggiungibile da altri dispositivi, occorre consentire il traffico HTTP e, se previsto, HTTPS.

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

Per verificare i servizi consentiti:

sudo firewall-cmd --list-services

HTTP utilizza la porta 80, mentre HTTPS utilizza la porta 443.

Servizio   Porta   Protocollo
HTTP       80      TCP
HTTPS      443     TCP
MariaDB    3306    TCP

In una configurazione standard LAMP, MariaDB non deve essere esposto pubblicamente. Il database dovrebbe rimanere accessibile solo localmente o da host strettamente autorizzati.

Permessi della directory web

La directory /var/www/html appartiene normalmente all’utente amministrativo o al servizio web. Durante lo sviluppo locale può essere comodo assegnare i permessi al proprio utente, mantenendo il gruppo associato ad Apache.

sudo chown -R $USER:apache /var/www/html
sudo chmod -R 775 /var/www/html

Su Fedora è importante considerare anche SELinux. Se i file vengono copiati manualmente nella document root, potrebbero avere un contesto non corretto e Apache potrebbe non riuscire a leggerli. Per ripristinare i contesti standard:

sudo restorecon -Rv /var/www/html

SELinux e pubblicazione dei contenuti

SELinux è un sistema di controllo degli accessi che aggiunge un livello di sicurezza al sistema. Invece di disattivarlo, è preferibile configurarlo correttamente. Per un sito collocato nella directory standard /var/www/html, in genere è sufficiente ripristinare i contesti con restorecon.

Se invece si decide di usare una directory personalizzata, ad esempio /srv/www/miosito, occorre assegnare il contesto corretto ai file serviti da Apache.

sudo semanage fcontext -a -t httpd_sys_content_t "/srv/www/miosito(/.*)?"
sudo restorecon -Rv /srv/www/miosito

Se il comando semanage non è disponibile, installare il pacchetto necessario:

sudo dnf install -y policycoreutils-python-utils

Configurazione di un Virtual Host

Un Virtual Host permette di ospitare uno o più siti sullo stesso server Apache, separando document root, log e nome dominio. Le configurazioni personalizzate possono essere salvate nella directory:

/etc/httpd/conf.d/

Esempio di configurazione per un dominio locale o reale:

sudo nano /etc/httpd/conf.d/miosito.conf
<VirtualHost *:80>
    ServerName miosito.local
    ServerAdmin webmaster@miosito.local
    DocumentRoot /var/www/miosito/public

    ErrorLog /var/log/httpd/miosito-error.log
    CustomLog /var/log/httpd/miosito-access.log combined

    <Directory /var/www/miosito/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Creare quindi la directory del sito:

sudo mkdir -p /var/www/miosito/public
echo "<?php echo 'Virtual Host attivo'; ?>" | sudo tee /var/www/miosito/public/index.php

Assegnare contesti SELinux e permessi:

sudo restorecon -Rv /var/www/miosito
sudo systemctl restart httpd

Se si usa un dominio locale, aggiungere una riga nel file /etc/hosts della macchina client:

127.0.0.1 miosito.local

File .htaccess e AllowOverride

Molti CMS, come WordPress, utilizzano file .htaccess per gestire permalink, rewrite URL e regole specifiche dell’applicazione. Per permettere ad Apache di leggere queste direttive, nella configurazione del Virtual Host è necessario impostare:

AllowOverride All

È inoltre necessario che il modulo rewrite sia disponibile. Su Fedora, la configurazione di Apache include normalmente i moduli principali, ma è sempre possibile verificare quelli caricati con:

httpd -M | grep rewrite

Log e diagnostica

Durante la configurazione di un server LAMP è fondamentale consultare i log. Apache registra errori e accessi nella directory:

/var/log/httpd/

I file più comuni sono:

/var/log/httpd/error_log
/var/log/httpd/access_log

Per seguire gli errori in tempo reale:

sudo tail -f /var/log/httpd/error_log

Per analizzare i messaggi del servizio tramite systemd:

journalctl -u httpd -xe

Per MariaDB:

journalctl -u mariadb -xe

Comandi utili di gestione

Riavviare Apache:
sudo systemctl restart httpd

Ricaricare Apache senza arresto completo:
sudo systemctl reload httpd

Verificare configurazione Apache:
sudo apachectl configtest

Avviare MariaDB:
sudo systemctl start mariadb

Riavviare MariaDB:
sudo systemctl restart mariadb

Accedere alla console MariaDB:
sudo mariadb

Elenco moduli PHP caricati:
php -m

Versione PHP:
php -v

Installazione opzionale di phpMyAdmin

phpMyAdmin è un’interfaccia web per la gestione di database MySQL e MariaDB. Può essere utile in ambienti di test o sviluppo, ma su server pubblici deve essere protetto con attenzione, perché rappresenta un bersaglio frequente per tentativi di accesso non autorizzati.

sudo dnf install -y phpMyAdmin

Dopo l’installazione, verificare la configurazione Apache generata dal pacchetto e limitare l’accesso solo agli indirizzi IP autorizzati, se il server è esposto su Internet.

Hardening di base

Un server LAMP appena installato funziona, ma non deve essere considerato automaticamente pronto per la produzione. È opportuno applicare alcune misure di sicurezza minime: mantenere il sistema aggiornato, non esporre MariaDB sulla rete pubblica, usare password robuste, rimuovere file di test, limitare i permessi di scrittura e consultare periodicamente i log.

Aggiornamento periodico:
sudo dnf update

Verifica porte in ascolto:
sudo ss -tulpn

Verifica servizi abilitati:
systemctl list-unit-files --type=service --state=enabled

È consigliabile evitare permessi troppo permissivi come chmod 777 sulle directory web. Un’applicazione dovrebbe poter scrivere solo nelle cartelle strettamente necessarie, ad esempio upload, cache o log applicativi.

HTTPS e certificati TLS

Per un server pubblico, HTTPS è ormai indispensabile. Permette di cifrare il traffico tra browser e server, proteggendo credenziali, cookie di sessione e dati inviati tramite form. Su Fedora è possibile utilizzare Certbot con Apache per richiedere certificati gratuiti da Let’s Encrypt, a condizione che il dominio punti correttamente all’indirizzo IP del server.

sudo dnf install -y certbot python3-certbot-apache

Avviare quindi la procedura guidata:

sudo certbot --apache

Per testare il rinnovo automatico:

sudo certbot renew --dry-run

Risoluzione dei problemi comuni

Se Apache non parte, il primo controllo da eseguire riguarda la sintassi della configurazione.

sudo apachectl configtest

Se una pagina PHP viene scaricata invece di essere interpretata, verificare che PHP sia installato correttamente e che Apache sia stato riavviato.

php -v
sudo systemctl restart httpd

Se il browser non raggiunge il server da un altro dispositivo, controllare firewall, indirizzo IP e stato del servizio Apache.

sudo firewall-cmd --list-services
systemctl status httpd
ip a

Se PHP non riesce a connettersi a MariaDB, verificare credenziali, nome database, presenza del modulo php-mysqlnd e stato del servizio database.

php -m | grep -i mysql
systemctl status mariadb
sudo mariadb

Struttura consigliata per un piccolo progetto PHP

Per evitare di esporre file sensibili, è buona pratica separare la directory pubblica dal codice applicativo. Solo la cartella public dovrebbe essere usata come document root del Virtual Host.

/var/www/miosito/
├── app/
│   ├── config.php
│   └── database.php
├── public/
│   ├── index.php
│   └── assets/
├── storage/
│   ├── cache/
│   └── logs/
└── vendor/

In questo modo file di configurazione, credenziali e librerie non sono direttamente raggiungibili tramite browser.

Admin | MST-Tutorial

Appassionato di elettronica, elettrotecnica e programmazione. Fondatore di MST-Tutorial, condivido con entusiasmo conoscenze, esperienze e progetti legati all’innovazione tecnologica, con l’obiettivo di rendere accessibili concetti tecnici complessi attraverso tutorial chiari e pratici.
Pulsante per tornare all'inizio