Guida Completa alla Configurazione di Apache Virtual Host: Gestire più Siti su un Singolo Server

Intermedio
DevOps e deployment

Impara a configurare gli Apache Virtual Host per ospitare più domini su un unico server web, migliorando l'organizzazione e l'efficienza del tuo ambiente di sviluppo.

Pubblicato
Tag
DevOps Apache web server VirtualHost Linux Hosting

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)?

  1. Isolamento: Ogni sito ha la propria directory radice, rendendo la gestione dei file più pulita.
  2. Simulazione Reale: Puoi utilizzare domini personalizzati (es. progetto.local invece di localhost/progetto), simulando l'ambiente di produzione.
  3. 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 .htaccess per 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-site
  • www.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:

  1. Implementazione SSL/TLS: Impara a configurare Certbot e Let's Encrypt per ottenere certificati HTTPS gratuiti e automatici.
  2. 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).
  3. Docker e Apache: Prova a containerizzare il tuo server Apache per rendere l'ambiente di sviluppo portabile e indipendente dal sistema operativo.
  4. Ottimizzazione Performance: Studia l'uso di mod_deflate per la compressione Gzip e mod_expires per 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.