La maggior parte delle persone serve più di un dominio sul proprio server cloud. Sia che tu stia servendo domini diversi o sottodomini diversi dello stesso dominio, la procedura è la stessa. Questo articolo descrive come creare host virtuali per servire più domini e come risolvere i problemi con le configurazioni di host virtuali basate su nomi Apache.
Creazione di host virtuali per più domini
Quando un browser invia una richiesta all'indirizzo IP del tuo server chiedendo il contenuto del tuo nome di dominio (ad esempio, https://yourexampledomain.com
), il tuo server web fornisce una rappresentazione HTTP del tuo sito. Se il server serve solo un sito web, serve l'HTML nel tuo /var/www/html
directory, iniziando con index.html
. Ma avere un server unico per ogni sito web che vuoi servire è costoso e un uso inefficiente delle tue risorse.
Host virtuali basati sul nome consentono di offrire contenuti per più siti Web da un server.
Una delle prime righe in qualsiasi file di configurazione dell'host virtuale specifica il nome di dominio associato all'host virtuale. Di seguito è riportato un esempio di configurazione di host virtuale per Apache, che serve domain1.com
:
<VirtualHost \*:80>
ServerName domain1.com
ServerAlias www.domain1.com
</VirtualHost>
L'esempio seguente mostra una configurazione di host virtuale per NGINX:
server {
server_name www.domain1.com;
rewrite ^/(.\*) https://domain1.com/$1 permanent;
Ogni configurazione inizia in modo leggermente diverso, ma si applica lo stesso principio:quel particolare host virtuale risponde alle query per domain1.com
e www.domain1.com
.
Per offrire contenuti diversi per domini diversi, aggiungi un altro host virtuale.
Ad esempio, hai un sottodominio chiamato blog.domain1.com che serve un blog.
Per prima cosa crei una cartella nella tua cartella public_html con i file rilevanti per il blog (ad esempio, un'installazione di WordPress).
Quindi crei un host virtuale con il server_name
o ServerName
specificato come blog.domain1.com
e configuralo in modo che punti ai file e alle cartelle del blog nel tuo public_html
cartella.
Per ulteriori informazioni sugli host virtuali, utilizzare il documento Apache Host virtuali basati sui nomi
Risoluzione dei problemi
Questa sezione mostra come risolvere i problemi con le configurazioni dell'host virtuale basato sul nome di Apache. Fornisce comandi utili per testare la configurazione dell'host virtuale, descrive come interpretarne l'output e descrive come aiutano a risolvere i problemi comuni di configurazione dell'host virtuale.
Riavvia Apache
Prima di poter diagnosticare un problema, assicurati di aver riavviato Apache dall'ultima volta che hai apportato modifiche ai file di configurazione di Apache:
-
Per le distribuzioni Red Hat utilizzare:
sudo /usr/sbin/httpd -k restart
-
Per le distribuzioni Debian utilizzare:
sudo /usr/sbin/apache2 -k restart
Se Apache ti dà un messaggio di avviso o di errore, annotalo per dopo. Il tuo prossimo passo è ottenere informazioni sulla configurazione dell'host virtuale.
Ricevi un rapporto di configurazione
Esegui -S
comando sul server web per verificare la configurazione del tuo host virtuale
-
Per le distribuzioni derivate da Red Hat utilizzare:
sudo /usr/sbin/httpd -S
-
Per le distribuzioni derivate da Debian utilizzare:
sudo /usr/sbin/apache2 -S
L'output mostra le impostazioni dell'host virtuale dal file di configurazione. L'esempio seguente mostra il report di configurazione per un server configurato con due host virtuali basati sul nome:vh1.example.com e vh2.example.com. Le righe numerate sono spiegate seguendo l'esempio.
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
[1] \*:80 is a NameVirtualHost
[2] default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[3] port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[4] port 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
[5] Syntax OK
-
La riga [1] riporta che il server Web è in ascolto sulla porta predefinita 80 per tutti gli indirizzi IP in ascolto di Apache e che l'hosting virtuale basato sul nome è attivato. * è un carattere jolly che specifica tutti gli indirizzi IP.
-
La riga [2] riporta l'host virtuale predefinito che il server Web ServerAlias per tutte le richieste per le quali non è richiesto un nome host specifico. Mostra anche il percorso del file di configurazione e il numero di riga in cui è impostata questa configurazione.
-
La riga [3] riporta la porta e il nome della prima configurazione di host virtuale trovata, il file in cui è configurato e il numero di riga da cui inizia la sua configurazione.
-
La riga [4] riporta la porta e il nome della seconda configurazione di host virtuale trovata, il file in cui è configurato e il numero di riga da cui inizia la sua configurazione.
-
La riga [5] indica se la sintassi di configurazione è corretta, anche se ciò non significa necessariamente che il tuo sito funzioni
Il seguente output è stato prodotto seguendo la configurazione del file host virtuale:
NameVirtualHost \*:80 Turns on name-based host resolution and binds the virtual server to IP addresses and ports as in [1] above. The \* is a wildcard specifying all IP addresses.
<VirtualHost \*:80> Configures the first and default virtual host in [2] & [3] above. It is the default because it is the first virtual host whose IP and port matches those in the NameVirtualHost directive before it.
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80> Configures the second virtual host in [4] above.
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Ora che hai visto l'aspetto di una configurazione di host virtuale di base e come si associa al rapporto di configurazione di Apache, puoi utilizzare quei rapporti per esaminare i problemi di configurazione comuni. Le sezioni seguenti descrivono alcuni di questi problemi e forniscono indicazioni su come risolverli.
Host non configurati come host virtuali basati sul nome
Se si esegue httpd -S
segnala il seguente avviso:
[Wed May 18 15:24:51 2011] [warn] \_default\_ VirtualHost overlap on port 80, the first has precedence
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:80 vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
Syntax OK
Questo avviso indica che più host virtuali stanno tentando di utilizzare lo stesso "socket" senza essere impostati come host virtuali basati sul nome. Questo errore si verifica spesso quando gli host virtuali Apache vengono creati per la prima volta a causa del valore predefinito NameVirtualHost
la direttiva è commentata con un simbolo hash. Quel simbolo indica ad Apache di ignorare la direttiva.
Per risolvere questo problema in un file di configurazione Apache predefinito, verifica che NameVirtualHost *:80
la direttiva non è commentata. Se stai lavorando con un file di configurazione Apache minimo, aggiungi un NameVirtualHost *:80
direttiva sopra le singole configurazioni dell'host virtuale.
L'esempio seguente mostra la direttiva commentata che ha causato l'errore:
#NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Elemento mancante dalla direttiva VirtualHost
Se si esegue httpd -S
segnala il seguente messaggio di errore:
Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
<VirtualHost> directive requires additional arguments
Questo messaggio significa che il VirtualHost
dell'host virtuale direttiva manca un elemento necessario. Il VirtualHost
direttiva è la prima riga di qualsiasi configurazione di host virtuale individuale. In questo caso, l'errore è sulla riga 8 del file di configurazione /etc/httpd/conf/custom/virtualhost.conf
.
Di seguito è riportata la configurazione di Apache che ha prodotto questo errore precedente:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Nota che il secondo VirtualHost
La direttiva non ha un indirizzo IP o una porta specificata, che è la causa dell'errore.
Di seguito è riportata una versione corretta dell'esempio precedente, con l'aggiunta di \*:80
alla direttiva dell'host virtuale. Come sempre, il \*
è un carattere jolly che specifica tutti gli indirizzi IP.
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
I numeri di porta non corrispondono
Se si esegue httpd -S
, mostra che un host virtuale è elencato sopra is a NameVirtualHost
riga:
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:800 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
\*:80 is a NameVirtualHost
default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
Syntax OK
In questo esempio, il test di configurazione riporta il vh2.example.com
configurazione prima che riporti il NameVirtualHost
configurazione. Potresti visualizzare questo errore se l'indirizzo IP o la porta di VirtualHost non corrispondono all'indirizzo IP o alla porta del NameVirtualHost
del server web direttiva. In questo esempio, il rapporto mostra che vh2.example.com
utilizza la porta 800 anziché la porta 80. Il numero di porta è stato digitato in modo errato quando vh2.example.com
la porta di ascolto dell'host virtuale è stata configurata. Di conseguenza, Apache tratta vh2.example.com
come host virtuale separato basato su una porta.
Il httpd -S
il comando test non avvisa su questo problema perché è consentito configurare host virtuali per utilizzare qualsiasi porta, ad esempio 800, senza che facciano parte della configurazione dell'host virtuale basata sul nome sullo stesso server.
Se riscontri questo errore, probabilmente vedrai il contenuto dell'host virtuale predefinito (vh1.example.com
in questo esempio) quando provi a visualizzare il sito nel tuo browser web.
Per aiutarti a mappare l'output precedente al relativo file di configurazione, di seguito è riportata la configurazione dell'host virtuale che ha creato questo errore:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:800>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
La directory principale del documento non esiste
Se si esegue httpd -S
segnala il seguente errore:
Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist
Questo errore indica che la directory specificata come contenente i file del sito Web per vh2.example.com
l'host virtuale non esiste o che Apache non può accedervi. Errori simili possono essere visualizzati per qualsiasi percorso di file specificato in una configurazione di host virtuale, come i percorsi dei file di registro dell'host virtuale.
Per correggere questo errore, assicurati di aver creato la directory. Se l'hai creato tu, verifica che non ci siano errori in DocumentRoot
direttiva. Un errore comune è omettere la barra iniziale del percorso (/). Se si omette la barra, si indica ad Apache di leggere il percorso, la DocumentRoot
percorso in questo caso, come percorso relativo, ovvero come percorso relativo al ServerRoot
della configurazione principale di Apache percorso.
L'esempio seguente mostra solo uno dei modi in cui viene creato questo errore. Il percorso per DocumentRoot
la direttiva nel primo host virtuale inizia con una barra ma il secondo no.
ServerRoot /etc/httpd
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot var/www/vhosts/vh2
</VirtualHost>
Utilizzo di cURL per testare il tuo sito
Dopo aver controllato i file di configurazione dell'host virtuale e il httpd -S
comando non segnala problemi, prova ad accedere al tuo sito utilizzando cURL:
curl -I www.example.com
L'output dovrebbe essere simile a questo:
HTTP/1.1 200 OK
Date: Sat, 07 May 2011 15:09:50 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Mon, 25 Apr 2011 11:07:43 GMT
ETag: "2c32e-77-4a1bc37723dc0"
Accept-Ranges: bytes
Content-Length: 119
Content-Type: text/html; charset=UTF-8
La prima riga mostra il codice di stato. Vuoi vedere 200 OK
, come mostrato nell'esempio. Se è quello che vedi, prova il server web con il tuo browser, ma considera che il tuo browser potrebbe visualizzare una pagina memorizzata nella cache.
Se non vedi 200 OK
, potresti visualizzare uno dei seguenti messaggi comuni:
-
curl: (6) Couldn't resolve host vh1.example.com
Se cURL segnala che non riesce a trovare l'host, verifica che sia presente un record A per il dominio che punta all'indirizzo IP corretto per il tuo server. Puoi usare lo scavo per farlo:
dig vh1.example.com
-
curl: (7) couldn't connect to host
Verifica che i tuoi file di configurazione di Apache includano il necessario
Listen
direttive e che non siano commentate. Ha bisogno diListen 80
almeno.Un altro modo per verificarlo è controllare il registro degli errori. Il registro degli errori predefinito è in
/var/log/httpd/error_log
sui sistemi Red Hat e/var/log/apache2/error_log
sui sistemi Debian. Se non viene specificata alcuna porta per l'ascolto di Apache, il messaggio nessun socket in ascolto disponibile, lo spegnimento segue il tentativo di riavvio di Apache.[notice] SIGHUP received. Attempting to restart no listening sockets available, shutting down Unable to open logs
-
HTTP/1.1 403 Forbidden
Questa risposta indica che le autorizzazioni che consentono ad Apache di accedere alla pagina che stai richiedendo non sono corrette. Forse i permessi della directory non sono corretti o potrebbe essere la pagina stessa.
Potresti anche visualizzare una risposta 403 nelle seguenti situazioni:
- The `DocumentRoot` contains no index file—-typically named `index.html` or `index.php`. Note that the file name is case sensitive.
- The virtual host doesn't contain a `DirectoryIndex` directive specifying the default index file.
I registri degli errori di Apache di solito mostrano quale directory o file ha i permessi impostati in modo errato. I singoli host virtuali potrebbero scrivere errori nei propri log se sono stati configurati, quindi controlla anche questi log.
Non lasciarti scoraggiare dalla quantità di dati nei file di registro di un server occupato. Utilizzare invece il comando tail per visualizzare selettivamente solo le dieci righe più recenti di un registro. Ad esempio:
tail /var/log/apache2/error\_log
Puoi vedere le nuove voci man mano che vengono aggiunte al registro degli errori, o qualsiasi registro, mentre esegui il test del server se indichi il tail
comando per “seguire” il log. Ad esempio:
tail -f /var/log/httpd/error\_log
Errori comuni relativi alle autorizzazioni
Di seguito sono riportati alcuni esempi di alcuni comuni errori di configurazione relativi alle autorizzazioni che possono apparire nei log di Apache:
-
La voce di registro seguente mostra le autorizzazioni su
index.html
file pervh2.example.com
stanno negando l'accesso ad Apache.[error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
-
La seguente voce di registro mostra che le autorizzazioni su
/var/www/vhosts/vh2
stanno bloccando la richiesta di lettura di Apache.[error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
-
La voce di registro seguente mostra che Apache non ha autorizzazioni di esecuzione o lettura su una delle directory sopra
DocumentRoot
.[error] [client 203.0.113.96] (13)Permission denied: access to / denied