Introduzione ai Virtual Host di Apache
Nel mondo dello sviluppo web, capita spesso di dover gestire più progetti contemporaneamente sullo stesso server. Che si tratti di un ambiente di sviluppo locale (come una macchina Linux o un server WSL su Windows) o di un server di produzione, l'idea di dover creare un server fisico separato per ogni sito web è inefficientemente costosa e tecnicamente superflua. È qui che entrano in gioco i Virtual Host di Apache.
Un Virtual Host è essenzialmente una configurazione che permette al server web Apache di ospitare più siti web (domini diversi) utilizzando un unico indirizzo IP. Quando una richiesta HTTP arriva al server, Apache esamina l'intestazione Host della richiesta per determinare quale sito web l'utente sta cercando di raggiungere e serve i contenuti dalla directory corrispondente.
Perché utilizzare i Virtual Host invece di semplici sottocartelle (es. localhost/sito1, localhost/sito2)?
- Isolamento: Ogni sito ha la propria directory radice, rendendo la gestione dei file più pulita.
- Simulazione Reale: Puoi utilizzare domini personalizzati (es.
progetto.localinvece dilocalhost/progetto), simulando l'ambiente di produzione. - Configurazioni Specifiche: Puoi definire diverse impostazioni di sicurezza, limiti di memoria o moduli PHP differenti per ogni singolo sito.
Concetti Fondamentali: Come Funziona il Routing
Prima di immergerci nel codice, è fondamentale capire come Apache decide quale sito mostrare. Il processo avviene in due fasi principali: la risoluzione del DNS e l'elaborazione dell'intestazione HTTP.
1. Risoluzione DNS
Quando digiti mio-sito.local nel browser, il computer deve sapere a quale indirizzo IP inviare la richiesta. In produzione, questo viene gestito dai server DNS globali. In ambiente locale, utilizziamo il file hosts del sistema operativo per mappare il dominio fittizio all'indirizzo IP del nostro server (solitamente 127.0.0.1).
2. L'Intestazione HTTP Host
Una volta che la richiesta raggiunge Apache, il server riceve un pacchetto che contiene l'intestazione Host: mio-sito.local. Apache scansiona i suoi file di configurazione cercando una direttiva <VirtualHost> che corrisponda a quel nome. Se trova una corrispondenza, serve i file indicati nella direttiva DocumentRoot.
Guida Passo-Passo alla Configurazione
Assumiamo di lavorare su un sistema basato su Linux (Ubuntu/Debian), che è lo standard per la maggior parte dei server web.
Fase 1: Preparazione della struttura delle directory
Il primo passo è creare le cartelle dove risiederanno i file dei nostri siti. È buona norma utilizzare /var/www/ per i progetti web.
# Creiamo le directory per due siti diversi
sudo mkdir -p /var/www/sito1.local/public
sudo mkdir -p /var/www/sito2.local/public
# Assegniamo i permessi all'utente corrente per poter modificare i file
sudo chown -R $USER:$USER /var/www/sito1.local/public
sudo chown -R $USER:$USER /var/www/sito2.local/public
Creiamo ora un file index.html di prova per ogni sito per verificare che tutto funzioni:
echo "<h1>Benvenuti nel Sito 1</h1>" > /var/www/sito1.local/public/index.html
echo "<h1>Benvenuti nel Sito 2</h1>" > /var/www/sito2.local/public/index.html
Fase 2: Creazione del file di configurazione del Virtual Host
Su sistemi Debian/Ubuntu, Apache utilizza una struttura organizzata: /etc/apache2/sites-available/ contiene i file di configurazione disponibili, mentre /etc/apache2/sites-enabled/ contiene i link simbolici ai siti effettivamente attivi.
Creiamo il file per il primo sito:
sudo nano /etc/apache2/sites-available/sito1.local.conf
Inseriamo il seguente contenuto:
<VirtualHost *:80>
# Il nome del dominio che Apache deve intercettare
ServerName sito1.local
ServerAlias www.sito1.local
# La directory dove si trovano i file del sito
DocumentRoot /var/www/sito1.local/public
# Configurazione dei log per facilitare il debug
ErrorLog ${APACHE_LOG_DIR}/sito1_error.log
CustomLog ${APACHE_LOG_DIR}/sito1_access.log combined
# Permessi per la directory (fondamentale per .htaccess)
<Directory /var/www/sito1.local/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Spiegazione delle direttive:
<VirtualHost *:80>: Indica che il server deve ascoltare su tutte le interfacce di rete sulla porta 80 (HTTP).ServerName: Specifica il dominio principale.DocumentRoot: Indica il percorso fisico dei file. Nota l'uso della cartella/public, best practice comune in framework come Laravel.AllowOverride All: Permette l'uso dei file.htaccessper gestire rewrite di URL e redirect, essenziale per applicazioni moderne.
Ripeti l'operazione per sito2.local.conf cambiando i nomi e i percorsi.
Fase 3: Attivazione del sito e riavvio di Apache
Ora dobbiamo dire ad Apache di abilitare queste configurazioni e ricaricare il servizio.
# Abilitiamo i nuovi siti
sudo a2ensite sito1.local.conf
sudo a2ensite sito2.local.conf
# Disabilitiamo il sito di default (opzionale)
sudo a2dissite 000-default.conf
# Verifichiamo che la sintassi dei file sia corretta
sudo apache2ctl configtest
# Se appare "Syntax OK", riavviamo il server
sudo systemctl restart apache2
Fase 4: Configurazione del file Hosts locale
Il browser non sa ancora che sito1.local punta al tuo computer. Dobbiamo istruire il sistema operativo.
sudo nano /etc/hosts
Aggiungi la seguente riga in fondo al file:
127.0.0.1 sito1.local sito2.local
Ora, aprendo il browser e digitando http://sito1.local, dovresti vedere il messaggio "Benvenuti nel Sito 1".
Esempi Pratici e Casi d'Uso Reali
Scenario A: Ambiente di Sviluppo Laravel
Se utilizzi Laravel, il tuo DocumentRoot non deve puntare alla radice del progetto, ma alla cartella /public. Questo è fondamentale per la sicurezza, poiché impedisce l'accesso diretto ai file .env e alle cartelle di configurazione.
<VirtualHost *:80>
ServerName laravel.test
DocumentRoot /var/www/my-laravel-app/public
<Directory /var/www/my-laravel-app/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Scenario B: Gestione di un sito di Stage e uno di Produzione
Puoi configurare due Virtual Host che puntano a directory diverse ma utilizzano lo stesso IP, differenziandoli per sottodominio:
dev.esempio.it$
ightarrow$/var/www/dev-sitewww.esempio.it$
ightarrow$/var/www/prod-site
Questo permette di testare nuove funzionalità in un ambiente speculare a quello reale prima del deployment finale.
Errori Comuni e Troubleshooting
1. Errore 403 Forbidden
Questo è l'errore più comune. Solitamente è causato da permessi insufficienti sulle directory. Apache (che gira sotto l'utente www-data) deve avere i permessi di lettura e di esecuzione su tutta la catena di directory che porta al DocumentRoot.
Soluzione:
sudo chown -R www-data:www-data /var/www/sito1.local/public
sudo chmod -R 755 /var/www/sito1.local
2. Il sito non carica (Timeout o Errore DNS)
Se ricevi un errore di "Sito non trovato", verifica due cose:
- Hai aggiunto correttamente il dominio al file
/etc/hosts? - Hai riavviato Apache dopo aver usato
a2ensite?
3. .htaccess ignorato (Errori 404 su URL amichevoli)
Se le pagine statiche funzionano ma i link dinamici (come in WordPress o Laravel) danno 404, significa che la direttiva AllowOverride All non è attiva o il modulo rewrite di Apache non è abilitato.
Soluzione:
sudo a2enmod rewrite
sudo systemctl restart apache2
FAQ Rapide
Posso usare i Virtual Host con HTTPS?
Sì, ma dovrai cambiare la porta da *:80 a *:443 e aggiungere le direttive per i certificati SSL (SSLEngine on, SSLCertificateFile, ecc.). In locale, puoi usare strumenti come mkcert per generare certificati validi.
Qual è la differenza tra ServerName e ServerAlias?
ServerName è l'identità principale del sito. ServerAlias permette di definire nomi alternativi (es. www.sito.it e sito.it) che devono puntare alla stessa configurazione.
Prossimi Passi e Approfondimenti
Ora che hai padronggiato i Virtual Host, puoi evolvere la tua infrastruttura web esplorando i seguenti temi:
- Implementazione SSL/TLS: Impara a configurare Certbot e Let's Encrypt per ottenere certificati HTTPS gratuiti e automatici.
- Reverse Proxy: Configura Apache come proxy per inoltrare le richieste a applicazioni che girano su altre porte (es. un'app Node.js su porta 3000).
- Docker e Apache: Prova a containerizzare il tuo server Apache per rendere l'ambiente di sviluppo portabile e indipendente dal sistema operativo.
- Ottimizzazione Performance: Studia l'uso di
mod_deflateper la compressione Gzip emod_expiresper la gestione della cache del browser.
La gestione dei Virtual Host è la base per qualsiasi amministratore di sistema o sviluppatore backend che desideri avere il pieno controllo sul proprio stack tecnologico.