Apache resta il web server più compatibile con le applicazioni PHP: legge i file .htaccess, e molti CMS e plugin danno per scontata la sua presenza. Su Ubuntu 26.04 LTS si installa con Apache 2.4.66, PHP 8.5 e MariaDB 11.8. La differenza rispetto alle guide di qualche anno fa è una sola, ma importante: PHP va collegato tramite PHP-FPM e non con il vecchio mod_php, così Apache può usare il modulo MPM event, più efficiente.
In breve
- Tempo: 30–40 minuti.
- Difficoltà: media.
- Cosa serve: un server Ubuntu 26.04 LTS (o Debian 13) con utente
sudoe UFW attivo, un dominio che punta all’IP del server per il virtual host e l’HTTPS.
Versioni di riferimento: Ubuntu 26.04 LTS con apache2 2.4.66, php8.5-fpm 8.5.4, mariadb-server 11.8.6; Debian 13 con apache2 2.4.69 e PHP 8.4 (versioni dei pacchetti al 4 novembre 2026). Procedura verificata sulla documentazione ufficiale al 4 novembre 2026.
Perché PHP-FPM e non mod_php
Il manuale di PHP lo spiega senza giri di parole: mod_php gira dentro i processi di Apache e, a meno di una compilazione thread-safe, richiede l’MPM prefork, che usa un processo per ogni connessione. Lo stesso manuale indica come configurazione consigliata l’MPM event (predefinito da Apache 2.4) con PHP-FPM. Nella pratica, event gestisce le connessioni keep-alive senza tenere occupato un processo pesante per ciascuna, e PHP-FPM si regola in modo indipendente. Sul pacchetto Ubuntu, event è l’MPM attivato di default: basta non installare libapache2-mod-php8.5, che lo sostituirebbe con prefork.
Prerequisiti e backup
Partite da un server con utente non root, chiavi SSH e firewall (guida https://hardwarfare.it/ai-software/linux/primo-setup-vps-ubuntu-ssh-firewall/). Se Apache o Nginx sono già in uso sulla macchina, salvate /etc/apache2, /etc/php e i database, e verificate che la porta 80 sia libera con sudo ss -tlnp | grep ':80': due web server non possono ascoltare sulla stessa porta.
Passo 1: installare Apache e aprire il firewall
sudo apt update
sudo apt install apache2
sudo ufw allow 'Apache Full'Il profilo Apache Full apre le porte 80 e 443 TCP.
Verifica: systemctl status apache2 deve essere active (running), e http://IP_SERVER nel browser deve mostrare la pagina predefinita di Ubuntu per Apache. Con a2query -M controllate l’MPM attivo: la risposta deve essere event.
Passo 2: installare PHP-FPM e collegarlo ad Apache
sudo apt install php8.5-fpm php8.5-cli php8.5-mysql php8.5-curl php8.5-xml php8.5-mbstring php8.5-intl php8.5-zip php8.5-gdIl pacchetto php8.5-fpm installa già un file di configurazione per Apache, /etc/apache2/conf-available/php8.5-fpm.conf, che inoltra tutti i file .php al socket /run/php/php8.5-fpm.sock tramite mod_proxy_fcgi. Va solo attivato insieme ai due moduli necessari, come suggerisce il pacchetto stesso al termine dell’installazione:
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.5-fpm
sudo systemctl restart apache2Su Debian 13 sostituite 8.5 con 8.4 in pacchetti, configurazione e socket.
Verifica: apache2ctl -M | grep -E 'proxy_fcgi|setenvif|mpm' deve elencare proxy_fcgi_module, setenvif_module e mpm_event_module. Se compare mpm_prefork_module, è stato installato mod_php: rimuovetelo e riattivate event.
Passo 3: MariaDB, database e utente dedicato
sudo apt install mariadb-server
sudo mariadb-secure-installationSu Ubuntu e Debian root@localhost si autentica tramite il plugin unix_socket: si entra con sudo mariadb, senza password, e mai da remoto. Lo script serve soprattutto a rimuovere utenti anonimi e database di prova. Poi create database e utente per il sito:
sudo mariadb
CREATE DATABASE NOME_DB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'UTENTE_DB'@'localhost' IDENTIFIED BY 'PASSWORD_ROBUSTA';
GRANT ALL PRIVILEGES ON NOME_DB.* TO 'UTENTE_DB'@'localhost';
EXIT;Verifica: mariadb -u UTENTE_DB -p NOME_DB deve entrare con la password scelta. sudo ss -tlnp | grep 3306 deve mostrare MariaDB in ascolto solo su 127.0.0.1.
Passo 4: il virtual host con mod_rewrite
sudo mkdir -p /var/www/TUO_DOMINIO/public
sudo chown -R $USER:www-data /var/www/TUO_DOMINIO
sudo nano /etc/apache2/sites-available/TUO_DOMINIO.conf
<VirtualHost *:80>
# nome principale e alias del sito
ServerName TUO_DOMINIO
ServerAlias www.TUO_DOMINIO
# cartella dei file pubblici
DocumentRoot /var/www/TUO_DOMINIO/public
<Directory /var/www/TUO_DOMINIO/public>
# niente elenco dei file nelle cartelle senza index
Options -Indexes +FollowSymLinks
# consente i file .htaccess (permalink di WordPress e simili)
AllowOverride All
Require all granted
</Directory>
# log separati per sito
ErrorLog ${APACHE_LOG_DIR}/TUO_DOMINIO.error.log
CustomLog ${APACHE_LOG_DIR}/TUO_DOMINIO.access.log combined
</VirtualHost>AllowOverride All è comodo ma ha un costo: Apache cerca un .htaccess in ogni cartella a ogni richiesta. Se l’applicazione non ne ha bisogno, scrivete AllowOverride None e mettete le regole direttamente nel virtual host.
sudo a2enmod rewrite
sudo a2ensite TUO_DOMINIO
sudo a2dissite 000-default
sudo apachectl configtest
sudo systemctl reload apache2Verifica: sudo apachectl configtest deve rispondere Syntax OK. Poi sudo apache2ctl -S elenca i virtual host caricati: il vostro dominio deve comparire sulla porta 80 con il file di configurazione giusto.
Passo 5: test di PHP e piccole pulizie
echo '<?php phpinfo();' > /var/www/TUO_DOMINIO/public/info.phpVerifica: http://TUO_DOMINIO/info.php deve indicare “Server API: FPM/FastCGI”. Se dice “Apache 2.0 Handler”, state usando mod_php. Cancellate subito il file: rm /var/www/TUO_DOMINIO/public/info.php.
Ubuntu lascia in /etc/apache2/conf-available/security.conf le impostazioni ServerTokens OS e ServerSignature On, che rivelano versione di Apache e sistema operativo. Cambiatele in ServerTokens Prod e ServerSignature Off, poi sudo apachectl configtest e sudo systemctl reload apache2.
phpMyAdmin: meglio un tunnel SSH
Il pacchetto phpmyadmin (versione 5.2.3 in Ubuntu 26.04) è disponibile, ma un pannello di amministrazione del database raggiungibile da Internet è uno dei bersagli più cercati dai bot. La nostra raccomandazione è non pubblicarlo affatto e usare un client grafico sul vostro PC (DBeaver, HeidiSQL o simili) attraverso un tunnel SSH, che porta la porta 3306 del server sul vostro computer senza aprirla nel firewall:
ssh -L 13306:127.0.0.1:3306 NOMEUTENTE@IP_SERVERFinché la sessione resta aperta, il client si collega a 127.0.0.1 porta 13306 con l’utente del database. Usiamo 13306 per non andare in conflitto con un eventuale MariaDB o MySQL locale. Se l’accesso viene rifiutato, può servire un utente creato per l’host '127.0.0.1' oltre che per 'localhost'. Se phpMyAdmin vi serve davvero, limitatene l’accesso al vostro indirizzo IP o mettetelo dietro autenticazione aggiuntiva, e sempre in HTTPS.
LAMP o LEMP? Il confronto onesto
| Aspetto | Apache + PHP-FPM | Nginx + PHP-FPM |
|---|---|---|
File .htaccess | supportati: le applicazioni si configurano da sole | non supportati: le regole vanno tradotte nel server block |
| Compatibilità con CMS e plugin | massima, è il caso previsto dalla maggior parte della documentazione | ottima, ma a volte servono regole scritte a mano |
| Consumo di memoria | con event e FPM vicino a Nginx; molto più alto con prefork e mod_php | basso e prevedibile |
| File statici e reverse proxy | capace, configurazione più verbosa | il suo punto di forza |
| Curva di apprendimento | molta documentazione, sintassi più lunga | sintassi compatta, meno esempi per casi particolari |
Il nostro verdetto: per un singolo sito WordPress su un VPS da 1–2 GB le prestazioni con PHP-FPM sono simili, e la scelta dipende da cosa sapete già gestire. Scegliete Apache se ereditate un sito che si basa su .htaccess o se usate applicazioni che lo richiedono; scegliete Nginx se sul server avete anche container o servizi da mettere dietro reverse proxy. La guida gemella è https://hardwarfare.it/ai-software/linux/installare-nginx-php-fpm-mariadb-ubuntu-lemp/.
Se qualcosa va storto
AH00558: apache2: Could not reliably determine the server's fully qualified domain name: è un avviso, non un errore. Si elimina aggiungendo una direttivaServerNameglobale, per esempio conecho "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.confesudo a2enconf servername.- 503 Service Unavailable sui file .php: Apache non raggiunge PHP-FPM. Controllate
systemctl status php8.5-fpme che il socket indicato inphp8.5-fpm.confesista in/run/php/. - I permalink restituiscono 404: manca
a2enmod rewrite, oppureAllowOverrideèNonee l’applicazione si affida a.htaccess. - Il browser mostra il codice PHP invece di eseguirlo: la configurazione
php8.5-fpmnon è attiva. Ripetetesudo a2enconf php8.5-fpme ricaricate. - Apache non si avvia dopo una modifica:
sudo apachectl configtestindica file e riga; il dettaglio è anche insudo journalctl -u apache2.
Come tornare indietro
Un sito si disattiva con sudo a2dissite TUO_DOMINIO e un reload; il collegamento a PHP-FPM con sudo a2disconf php8.5-fpm. Per togliere tutto lo stack: sudo apt purge apache2 php8.5-fpm mariadb-server e sudo apt autoremove.
Attenzione: esportate i database prima di rimuovere MariaDB, con sudo mariadb-dump --all-databases > backup-completo.sql. Se in fase di rimozione confermate la cancellazione dei dati, il contenuto di /var/lib/mysql è perso.
La nostra lettura
Un LAMP del 2026 non ha più il difetto storico di Apache, cioè la memoria divorata da prefork e mod_php: con event e PHP-FPM è una scelta pienamente moderna, e la più indolore per chi lavora con .htaccess. Prossimi passi: HTTPS con https://hardwarfare.it/ai-software/linux/certificato-https-lets-encrypt-certbot/ (il plugin per Apache configura tutto da solo) e il rinforzo del server con https://hardwarfare.it/guide-tecniche/guide-server-self-hosting/proteggere-server-linux-ssh-fail2ban-ufw/.
Fonti
- Apache HTTP Server 2.4 docs
- Apache, mod_proxy_fcgi
- Apache, apachectl
- PHP Manual, Apache 2 su Unix
- PHP Manual, FPM
- MariaDB docs
- Ubuntu Server docs
Immagine di copertina: Wikimedia Foundation Servers 2015-29.jpg di VGrigas (WMF), licenza CC BY-SA 3.0, via Wikimedia Commons; elaborazione grafica HardWarfare.
Articolo redatto con il supporto di strumenti di intelligenza artificiale e verificato dalla redazione. Come usiamo l'AI · Come lavoriamo
