GNU/Linux >> Linux Esercitazione >  >> Linux

Servi più domini utilizzando host virtuali

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 di Listen 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

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 per vh2.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
    

Linux
  1. Come aggiungere più host in phpMyAdmin

  2. Ssh – Scp attraverso più host?

  3. Come ospitare più domini?

  4. Come configurare un sottodominio o ospitare più domini usando nginx nel server Linux

  5. Configura host virtuali su CentOS

Ospita più domini di posta in PostfixAdmin su CentOS/RHEL

Come configurare gli host virtuali Apache su Rocky Linux

Come configurare gli host virtuali Apache su Debian 11

Come configurare gli host virtuali Apache su Ubuntu 18.04

Come configurare gli host virtuali Apache su Ubuntu 20.04

Gestione di host dedicati