Host virtuali Nginx: Ospitare più siti web su un unico server
Le moderne infrastrutture web spesso richiedono la capacità di servire più siti web o applicazioni web da una singola istanza del server. Questo non solo ottimizza l'utilizzo delle risorse, ma semplifica anche la gestione e riduce i costi operativi. Nginx, noto per le sue alte prestazioni, stabilità, ricco set di funzionalità e basso consumo di risorse, raggiunge questo obiettivo attraverso quelli che chiama server blocks, spesso indicati come virtual hosts nel mondo Apache.
Questa guida completa ti accompagnerà attraverso il processo di configurazione degli host virtuali Nginx per gestire e servire in modo efficace più nomi di dominio distinti o sottodomini da un unico server Nginx. Che tu stia ospitando example.com e anothersite.org, o un sito principale con sottodomini come blog.example.com e shop.example.com, padroneggiare i server block di Nginx è un'abilità fondamentale per qualsiasi amministratore di sistema o sviluppatore. Alla fine di questo articolo, avrai una chiara comprensione ed esempi pratici per configurare il tuo server Nginx per l'hosting multisito.
Comprendere i Server Block Nginx (Host Virtuali)
In fondo, un server block di Nginx è una direttiva di configurazione definita all'interno del file di configurazione di Nginx (nginx.conf o file inclusi). Ogni blocco server definisce la configurazione per uno specifico host virtuale, dettando come Nginx dovrebbe rispondere alle richieste per un particolare dominio o set di domini. Nginx utilizza la direttiva listen per specificare l'indirizzo IP e la porta su cui dovrebbe ascoltare, e la direttiva server_name per identificare a quali nomi di dominio o hostname questo server block dovrebbe rispondere.
Quando arriva una richiesta, Nginx esamina l'header Host della richiesta HTTP e lo confronta con le direttive server_name dei suoi server block configurati. Successivamente serve il contenuto definito nel server block corrispondente. Se nessun server_name corrisponde, Nginx solitamente ricade sul server block predefinito (il primo blocco server o uno esplicitamente contrassegnato come default_server).
Prerequisiti
Prima di iniziare, assicurati di avere quanto segue:
- Nginx installato: Nginx dovrebbe essere installato e in esecuzione sul tuo server. In caso contrario, puoi solitamente installarlo tramite il gestore di pacchetti del tuo sistema (ad esempio,
sudo apt update && sudo apt install nginxsu Ubuntu/Debian,sudo yum install nginxsu CentOS/RHEL). - Nomi di dominio: Hai bisogno di almeno due nomi di dominio (ad esempio,
example1.comeexample2.com) o sottodomini (ad esempio,blog.example.comeapp.example.com) che desideri ospitare. I record DNS A/AAAA di questi domini devono puntare all'indirizzo IP pubblico del tuo server. - Struttura di directory di base: Un piano su dove risiederanno i file del tuo sito web. Una pratica comune è
/var/www/tuodominio.com/html. - Privilegi Sudo: Avrai bisogno dell'accesso
sudoper modificare i file di configurazione di Nginx.
Guida alla configurazione passo-passo
Configuriamo due host virtuali: example1.com e example2.com.
Passaggio 1: Creare la struttura di directory per i siti web
Innanzitutto, crea le directory root per ciascuno dei tuoi siti web. Qui verranno archiviati i loro file HTML, CSS, JavaScript e altri file statici. Una posizione comune è /var/www/.
sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html
# Imposta la proprietà al tuo utente (sostituisci $USER con il tuo nome utente) per consentire la modifica
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html
# Imposta i permessi di lettura per il server web
sudo chmod -R 755 /var/www
Successivamente, crea un semplice file index.html in ogni directory per testare la configurazione:
Per /var/www/example1.com/html/index.html:
<!-- /var/www/example1.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Benvenuti su Example1.com!</title>
</head>
<body>
<h1>Successo! Questo è Example1.com.</h1>
<p>Questo host virtuale funziona correttamente.</p>
</body>
</html>
Per /var/www/example2.com/html/index.html:
<!-- /var/www/example2.com/html/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>Benvenuti su Example2.com!</title>
</head>
<body>
<h1>Successo! Questo è Example2.com.</h1>
<p>Anche questo host virtuale funziona!</p>
</body>
</html>
Passaggio 2: Creare i file di configurazione del blocco server Nginx
Nginx solitamente carica le configurazioni dei blocchi server dai file nella directory /etc/nginx/sites-enabled/. Questi file sono di solito symlink a configurazioni memorizzate in /etc/nginx/sites-available/. Questa separazione ti consente di archiviare configurazioni che non sono ancora attive o di abilitare/disabilitare facilmente i siti.
Crea un nuovo file di configurazione per example1.com:
sudo nano /etc/nginx/sites-available/example1.com.conf
Aggiungi il seguente contenuto:
# /etc/nginx/sites-available/example1.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/example1.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example1.com www.example1.com;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example1.com_access.log;
error_log /var/log/nginx/example1.com_error.log;
}
Spiegazione delle direttive:
listen 80;: Nginx ascolta sulla porta 80 (HTTP standard).listen [::]:80;è per IPv6.root /var/www/example1.com/html;: Specifica la root dei documenti per questo blocco server. Nginx cercherà i file all'interno di questa directory.index index.html ...;: Definisce il file predefinito che Nginx dovrebbe servire quando viene richiesta una directory (ad esempio, quando qualcuno visitaexample1.com/).server_name example1.com www.example1.com;: Questo è cruciale. Indica a Nginx di rispondere alle richieste perexample1.comowww.example1.comutilizzando la configurazione di questo blocco server.location / { ... }: Un blocco che definisce come gestire le richieste per URI specifici.try_filestenta di servire un file direttamente ($uri), quindi una directory ($uri/), e infine restituisce un errore404 Not Found.access_logederror_log: Specifica file di log separati per questo sito specifico, il che è una buona pratica per facilitare il debug e l'analisi.
Ora, crea un file di configurazione simile per example2.com:
sudo nano /etc/nginx/sites-available/example2.com.conf
Aggiungi il seguente contenuto:
# /etc/nginx/sites-available/example2.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/example2.com/html;
index index.html index.htm index.nginx-debian.html;
server_name example2.com www.example2.com;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example2.com_access.log;
error_log /var/log/nginx/example2.com_error.log;
}
Passaggio 3: Abilitare i blocchi server
Per abilitare queste configurazioni, crea collegamenti simbolici dalla directory sites-available alla directory sites-enabled. Questo indica a Nginx di includere questi file quando si avvia.
sudo ln -s /etc/nginx/sites-available/example1.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/
Passaggio 4: Testare la configurazione di Nginx
È fondamentale testare la configurazione di Nginx per errori di sintassi prima di ricaricare. Questo impedisce a Nginx di non riavviarsi a causa di un errore di battitura.
sudo nginx -t
Dovresti vedere un output simile a questo, che indica successo:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Se vedi degli errori, correggili nei rispettivi file di configurazione e riavvia sudo nginx -t finché non passa.
Passaggio 5: Riavviare Nginx
Applica la nuova configurazione riavviando o ricaricando Nginx. Il reload è generalmente preferito in quanto consente a Nginx di caricare nuove configurazioni senza interrompere le connessioni attive.
sudo systemctl reload nginx
# Oppure, se il reload non funziona o per nuove installazioni:
sudo systemctl restart nginx
Passaggio 6: Aggiornare i record DNS
Assicurati che i record DNS A per example1.com, www.example1.com, example2.com e www.example2.com puntino tutti all'indirizzo IP del tuo server Nginx. Senza voci DNS corrette, il tuo browser non saprà dove trovare i tuoi siti web.
Una volta completata la propagazione DNS (che può richiedere da pochi minuti a diverse ore), dovresti essere in grado di visitare http://example1.com e http://example2.com nel tuo browser web e vedere le rispettive pagine index.html.
Scenari Avanzati e Migliori Pratiche
Hosting di sottodomini
L'hosting di sottodomini (ad es. blog.example.com, shop.example.com) funziona esattamente come l'hosting di domini separati. Devi solo definire un nuovo blocco server con il sottodominio come server_name.
Esempio per blog.example.com:
# /etc/nginx/sites-available/blog.example.com.conf
server {
listen 80;
listen [::]:80;
root /var/www/blog.example.com/html;
index index.html;
server_name blog.example.com;
location / {
try_files $uri $uri/ =404;
}
}
Ricorda di creare la directory (/var/www/blog.example.com/html), creare un index.html, creare il symlink e ricaricare Nginx.
Il blocco server predefinito
È buona pratica avere un blocco server predefinito che catturi le richieste per nomi di dominio che non corrispondono a nessun'altra direttiva server_name sul tuo server. Questo impedisce che richieste sconosciute vengano servite dal "primo" host virtuale che Nginx trova, o ti consente di servire una pagina generica "sito non trovato".
Tipicamente, il primo blocco server nel tuo nginx.conf o sites-enabled è implicitamente quello predefinito. Puoi impostarne esplicitamente uno usando default_server:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
# L'underscore `_` è un nome di dominio inesistente che non corrisponderà mai a una richiesta reale.
# Puoi anche usare localhost.
root /var/www/default_site/html;
index index.html;
location / {
return 444; # Restituisce un errore 444 specifico di Nginx (nessuna risposta) per host sconosciuti
# Oppure, servi una landing page generica:
# try_files $uri $uri/ =404;
}
}
Avvertenza: Se definisci un blocco default_server, assicurati che solo un blocco server su una data porta listen abbia il flag default_server, altrimenti Nginx registrerà un avviso.
Proteggere gli host virtuali con HTTPS (SSL/TLS)
Per i siti web di produzione, abilitare HTTPS è essenziale. Ciò comporta l'ottenimento di un certificato SSL/TLS (ad esempio, tramite Let's Encrypt usando Certbot) e la configurazione di Nginx per l'ascolto sulla porta 443 con il certificato.
Un tipico blocco server HTTPS si presenta così (dopo aver ottenuto i certificati):
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example1.com www.example1.com;
root /var/www/example1.com/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/example1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example1.com/privkey.pem;
# Includi altre configurazioni SSL (cifre, protocolli, ecc.)
include /etc/nginx/snippets/ssl-params.conf;
include /etc/nginx/snippets/force-ssl.conf; # Opzionale: reindirizza HTTP a HTTPS
location / {
try_files $uri $uri/ =404;
}
}
# Opzionale: reindirizzamento da HTTP a HTTPS per questo dominio
server {
listen 80;
listen [::]:80;
server_name example1.com www.example1.com;
return 301 https://$host$request_uri;
}
È comune avere un blocco server HTTP separato il cui unico scopo è reindirizzare tutto il traffico alla sua controparte HTTPS.
Logging per ogni sito
Come mostrato negli esempi, dedicare file access_log ed error_log separati per ogni host virtuale è una buona pratica. Questo rende significativamente più facile eseguire il debug dei problemi e analizzare il traffico per i singoli siti web senza dover setacciare log combinati.
Struttura del file di configurazione
Per distribuzioni più grandi, considera di organizzare i tuoi file di configurazione Nginx in questo modo:
nginx.conf: Configurazione principale, includeconf.d/*.confesites-enabled/*.conf.d/: Impostazioni generali a livello di server (ad esempio, Gzip, caching).snippets/: Frammenti di configurazione Nginx riutilizzabili (ad esempio, parametri SSL, blocchilocationcomuni).sites-available/: Blocchiserverindividuali per ogni sito web.sites-enabled/: Collegamenti simbolici a configurazioni attive insites-available/.
Risoluzione dei problemi comuni
- Errore 403 Forbidden: Questo di solito significa che Nginx non ha i permessi di lettura per i file o le directory del tuo sito web. Ricontrolla i permessi di file e directory (ad esempio,
sudo chmod -R 755 /var/www/tuodominio.com/htmle assicurati che l'utente Nginx, tipicamentewww-dataonginx, possa leggerli). - Errore 404 Not Found: Verifica che la direttiva
rootnel tuo blocco server punti alla directory corretta e che il tuo fileindex.htmlesista in quella posizione. Inoltre, assicurati chetry_filessia configurato correttamente. - Caricamento del sito sbagliato: Ciò indica spesso un problema con la direttiva
server_name. Assicurati che ilserver_namecorrisponda esattamente al nome di dominio a cui stai cercando di accedere (inclusowww.o sottodomini). Controlla anche i tuoi record DNS. - Nginx non si avvia/ricarica: Utilizza sempre
sudo nginx -tper testare la configurazione prima di tentare di ricaricare o riavviare Nginx. I messaggi di errore indicheranno la riga e il file in cui si è verificato l'errore di sintassi. - Problemi DNS: Se puoi accedere al tuo sito tramite indirizzo IP ma non tramite nome di dominio, è quasi certamente un problema DNS. Usa
digonslookupper verificare che i record A del tuo dominio puntino all'indirizzo IP corretto del server.
Conclusione
Gli host virtuali Nginx (server block) offrono un modo potente e flessibile per ospitare più siti web su un unico server. Configurando correttamente i blocchi server con le direttive appropriate listen, server_name, root e location, è possibile gestire in modo efficiente diverse proprietà web. Questo approccio non solo conserva le risorse, ma centralizza anche l'amministrazione del server.
Con le conoscenze fondamentali e i passaggi pratici descritti in questa guida, ora sei equipaggiato per configurare e gestire più domini sul tuo server Nginx. Ricorda di testare sempre le tue configurazioni, proteggere i tuoi siti con HTTPS e seguire le migliori pratiche per il logging e la struttura delle directory per un ambiente web robusto e manutenibile. Da qui, puoi esplorare ulteriormente le capacità di Nginx come il reverse proxying, il bilanciamento del carico e il caching per migliorare le prestazioni e l'affidabilità del tuo server web.