GNU/Linux >> Znalost Linux >  >> Linux

Obsluhujte více domén pomocí virtuálních hostitelů

Většina lidí obsluhuje na svém cloudovém serveru více než jednu doménu. Ať už obsluhujete různé domény nebo různé subdomény stejné domény, postup je stejný. Tento článek popisuje, jak vytvořit virtuální hostitele pro obsluhu více domén a jak řešit problémy s konfiguracemi virtuálních hostitelů založených na názvech Apache.

Vytváření virtuálních hostitelů pro více domén

Když prohlížeč odešle na IP adresu vašeho serveru požadavek na obsah názvu vaší domény (například https://yourexampledomain.com ), váš webový server poskytuje HTTP reprezentaci vašeho webu. Pokud server obsluhuje pouze jeden web, zobrazí kód HTML ve vašem /var/www/html adresář začínající index.html . Ale mít jedinečný server pro každý web, který chcete obsluhovat, je nákladné a neefektivní využití vašich zdrojů.

Virtuální hostitelé podle jména vám umožní poskytovat obsah pro více webových stránek z jednoho serveru.

Jeden z prvních řádků v libovolném konfiguračním souboru virtuálního hostitele uvádí název domény, která je přidružena k virtuálnímu hostiteli. Následuje příklad konfigurace virtuálního hostitele pro Apache, který obsluhuje domain1.com :

    <VirtualHost \*:80>

      ServerName  domain1.com

      ServerAlias www.domain1.com

    </VirtualHost>

Následující příklad ukazuje konfiguraci virtuálního hostitele pro NGINX:

    server {

      server_name  www.domain1.com;

      rewrite ^/(.\*) https://domain1.com/$1 permanent;

Každá konfigurace začíná trochu jinak, ale platí stejný princip:konkrétní virtuální hostitel odpovídá na dotazy na domain1.com a www.domain1.com .

Chcete-li poskytovat různý obsah pro různé domény, přidejte dalšího virtuálního hostitele.

Máte například subdoménu s názvem blog.domain1.com, která obsluhuje blog.

Nejprve vytvořte složku ve složce public_html s příslušnými soubory pro blog (například instalace WordPressu).

Poté vytvoříte virtuálního hostitele s server_name nebo ServerName zadaný jako blog.domain1.com a nakonfigurujte jej tak, aby odkazoval na soubory a složky blogu ve vašem public_html složka.

Další informace o virtuálních hostitelích naleznete v dokumentu Apache Virtuální hostitelé s bází jmen

Odstraňování problémů

Tato část ukazuje, jak řešit problémy s konfiguracemi virtuálních hostitelů založených na názvech Apache. Poskytuje užitečné příkazy pro testování konfigurace vašeho virtuálního hostitele, popisuje, jak interpretovat jejich výstup, a popisuje, jak pomáhají opravit běžné problémy s konfigurací virtuálního hostitele.

Restartujte Apache

Než budete moci diagnostikovat problém, ujistěte se, že jste restartovali Apache od posledního provedení změn v konfiguračních souborech Apache:

  • Pro distribuce Red Hat použijte:

      sudo /usr/sbin/httpd -k restart
    
  • Pro distribuce Debianu použijte:

      sudo /usr/sbin/apache2 -k restart
    

Pokud vám Apache zobrazí varování nebo chybovou zprávu, poznamenejte si to na později. Dalším krokem je získání informací o konfiguraci virtuálního hostitele.

Získejte sestavu konfigurace

Spusťte -S příkaz na webovém serveru pro kontrolu konfigurace vašeho virtuálního hostitele

  • Pro distribuce odvozené od Red Hatu použijte:

      sudo /usr/sbin/httpd -S
    
  • Pro distribuce odvozené od Debianu použijte:

      sudo /usr/sbin/apache2 -S
    

Výstup zobrazuje nastavení virtuálního hostitele z konfiguračního souboru. Následující příklad ukazuje sestavu konfigurace pro server nakonfigurovaný se dvěma virtuálními hostiteli založenými na názvech:vh1.example.com a vh2.example.com. Číslované řádky jsou vysvětleny podle příkladu.

      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
  • Řádek [1] hlásí, že webový server naslouchá na výchozím portu 80 pro všechny IP adresy, kterým naslouchá Apache, a že je zapnutý virtuální hosting na základě názvu. * je zástupný znak určující všechny IP adresy.

  • Řádek [2] uvádí výchozí virtuální hostitel, který webový server ServerAlias ​​pro všechny požadavky, pro které není požadován žádný konkrétní název hostitele. Zobrazuje také cestu ke konfiguračnímu souboru a číslo řádku, kde je tato konfigurace nastavena.

  • Řádek [3] uvádí port a název první nalezené konfigurace virtuálního hostitele, soubor, ve kterém je nakonfigurován, a číslo řádku, na kterém začíná konfigurace.

  • Řádek [4] uvádí port a název druhé nalezené konfigurace virtuálního hostitele, soubor, ve kterém je nakonfigurován, a číslo řádku, na kterém začíná konfigurace.

  • Řádek [5] uvádí, zda je konfigurační syntaxe správná, i když to nutně neznamená, že váš web funguje

Následující výstup byl vytvořen následující konfigurací souboru virtuálního hostitele:

  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>

Nyní, když jste viděli základní konfiguraci virtuálního hostitele a její mapování na vlastní konfigurační sestavu Apache, můžete tyto sestavy použít k prozkoumání běžných problémů s konfigurací. Následující části popisují některé z těchto problémů a poskytují návod, jak je opravit.

Hostitelé nejsou nastaveni jako virtuální hostitelé podle jména

Pokud běží httpd -S hlásí následující varování:

[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

Toto varování znamená, že se několik virtuálních hostitelů pokouší používat stejnou „zásuvku“, aniž by byli nastaveni jako virtuální hostitelé na základě názvu. K této chybě často dochází při prvním vytvoření virtuálních hostitelů Apache, protože výchozí NameVirtualHost direktiva je zakomentována symbolem hash. Tento symbol instruuje Apache, aby direktivu ignoroval.

Chcete-li tento problém vyřešit ve výchozím konfiguračním souboru Apache, ověřte, že NameVirtualHost *:80 směrnice není komentována. Pokud pracujete s minimálním konfiguračním souborem Apache, přidejte NameVirtualHost *:80 nad jednotlivými konfiguracemi virtuálního hostitele.

Následující příklad ukazuje direktivu s komentářem, která způsobila chybu:

#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>

Chybí prvek v direktivě VirtualHost

Pokud běží httpd -S hlásí následující chybovou zprávu:

Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
	<VirtualHost> directive requires additional arguments

Tato zpráva znamená, že VirtualHost virtuálního hostitele směrnice chybí nezbytný prvek. VirtualHost direktiva je první řádek každé konfigurace virtuálního hostitele. V tomto případě je chyba na řádku 8 konfiguračního souboru /etc/httpd/conf/custom/virtualhost.conf .

Následuje konfigurace Apache, která způsobila výše uvedenou chybu:

    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>

Všimněte si, že druhý VirtualHost direktiva nemá specifikovanou IP adresu ani port, což je příčinou chyby.

Následuje opravená verze předchozího příkladu s přidáním \*:80 podle směrnice virtuálního hostitele. Jako vždy \* je zástupný znak určující všechny IP adresy.

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>

Čísla portů se neshodují

Pokud běží httpd -S , ukazuje, že virtuální hostitel je uveden nad is a NameVirtualHost řádek:

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

V tomto příkladu test konfigurace hlásí vh2.example.com konfiguraci před tím, než nahlásí NameVirtualHost konfigurace. Tato chyba se může zobrazit, pokud IP adresa nebo port VirtualHost neodpovídá IP adrese nebo portu NameVirtualHost webového serveru směrnice. V tomto příkladu sestava ukazuje, že vh2.example.com používá port 800 spíše než port 80. Číslo portu bylo zadáno špatně, když vh2.example.com byl nakonfigurován naslouchací port virtuálního hostitele. V důsledku toho Apache zachází s vh2.example.com jako samostatný virtuální hostitel založený na portu.

httpd -S testovací příkaz neupozorňuje vás o tomto problému, protože je přípustné nakonfigurovat virtuální hostitele tak, aby používali jakýkoli port, například 800, aniž by byli součástí konfigurace virtuálního hostitele založeného na názvu na stejném serveru.

Pokud k této chybě dojde, pravděpodobně uvidíte obsah z výchozího virtuálního hostitele (vh1.example.com v tomto příkladu) při pokusu o zobrazení webu ve webovém prohlížeči.

Abychom vám pomohli namapovat předchozí výstup na jeho konfigurační soubor, uvádíme konfiguraci virtuálního hostitele, která způsobila tuto chybu:

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>

Kořenový adresář dokumentů neexistuje

Pokud běží httpd -S hlásí následující chybu:

Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist

Tato chyba znamená, že adresář určený jako obsahující soubory webu pro vh2.example.com virtuální hostitel neexistuje nebo k němu Apache nemá přístup. Podobné chyby se mohou objevit u jakékoli cesty k souboru zadané v konfiguraci virtuálního hostitele, jako jsou cesty k souborům protokolu virtuálního hostitele.

Chcete-li tuto chybu opravit, ujistěte se, že jste vytvořili adresář. Pokud jste jej vytvořili, ověřte, že v DocumentRoot nejsou žádné chyby směrnice. Častou chybou je vynechat počáteční lomítko cesty (/). Vynecháním lomítka dává Apache pokyn, aby si přečetl cestu – DocumentRoot cesta v tomto případě – jako relativní cesta, to znamená jako cesta relativní k ServerRoot hlavní konfigurace Apache cesta.

Následující příklad ukazuje pouze jeden ze způsobů, jak se tato chyba vytváří. Cesta pro DocumentRoot direktiva v prvním virtuálním hostiteli začíná lomítkem, ale druhá nikoli.

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>

Použití cURL k testování webu

Poté, co zkontrolujete konfigurační soubory virtuálního hostitele a httpd -S příkaz nehlásí žádné problémy, zkuste se na svůj web dostat pomocí cURL:

    curl -I www.example.com

Výstup by měl vypadat nějak takto:

    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

První řádek zobrazuje stavový kód. Chcete vidět 200 OK , jak je ukázáno v příkladu. Pokud je to to, co vidíte, otestujte webový server pomocí svého prohlížeče, ale zvažte, že váš prohlížeč může zobrazit stránku uloženou v mezipaměti.

Pokud nevidíte 200 OK , můžete vidět jednu z následujících běžných zpráv:

  • curl: (6) Couldn't resolve host vh1.example.com

    Pokud cURL hlásí, že nemůže najít hostitele, ověřte, zda existuje záznam A pro doménu, který ukazuje na správnou IP adresu vašeho serveru. K tomu můžete použít dig:

      dig vh1.example.com
    
  • curl: (7) couldn't connect to host

    Ověřte, že vaše konfigurační soubory Apache obsahují potřebné Listen směrnice a že nejsou komentovány. Vyžaduje to Listen 80 přinejmenším.

    Dalším způsobem, jak to ověřit, je zkontrolovat protokol chyb. Výchozí protokol chyb je na adrese /var/log/httpd/error_log na systémech Red Hat a /var/log/apache2/error_log na systémech Debian. Pokud není specifikován žádný port, na kterém by Apache mohl naslouchat, zobrazí se zpráva nejsou k dispozici žádné naslouchající sokety, vypnutí následuje po pokusu Apache o restart.

    [notice] SIGHUP received.  Attempting to restart no listening sockets available, shutting down
        Unable to open logs
    
  • HTTP/1.1 403 Forbidden

Tato odpověď znamená, že oprávnění, která umožňují Apache přístup ke stránce, kterou požadujete, nejsou správná. Možná jsou nesprávná oprávnění k adresáři, nebo to může být samotná stránka.

Odpověď 403 můžete vidět také v následujících situacích:

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

Protokoly chyb Apache obvykle ukazují, který adresář nebo soubor má nesprávně nastavená oprávnění. Jednotliví virtuální hostitelé mohou zapisovat chyby do svých vlastních protokolů, pokud by tak byli nakonfigurováni, proto zkontrolujte také tyto protokoly.

Nenechte se odradit množstvím dat v souborech protokolu zaneprázdněného serveru. Místo toho použijte příkaz tail k selektivnímu zobrazení pouze posledních deseti řádků protokolu. Například:

    tail /var/log/apache2/error\_log

Můžete vidět nové položky, jak jsou přidávány do protokolu chyb nebo do jakéhokoli protokolu, když testujete server, pokud zadáte příkaz tail příkaz „sledovat“ protokol. Například:

    tail -f /var/log/httpd/error\_log

Níže jsou uvedeny příklady některých běžných chyb konfigurace souvisejících s oprávněními, které se mohou objevit v protokolech Apache:

  • Následující záznam protokolu ukazuje, že oprávnění na index.html soubor pro vh2.example.com odmítají přístup k Apache.

    [error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
    
  • Následující záznam protokolu ukazuje, že oprávnění na /var/www/vhosts/vh2 adresář blokuje požadavek Apache na čtení.

    [error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
    
  • Následující záznam protokolu ukazuje, že Apache nemá oprávnění ke spuštění nebo čtení v jednom z adresářů výše DocumentRoot .

    [error] [client 203.0.113.96] (13)Permission denied: access to / denied
    

Linux
  1. Jak hostovat více domén?

  2. Nastavte virtuální hostitele na CentOS

  3. Více knihoven glibc na jednom hostiteli

  1. Jak přidat více hostitelů v phpMyAdmin

  2. Víceprůchodové virtuální stroje pomocí Ansible

  3. Ssh – Scp přes více hostitelů?

  1. Jak přejmenovat více souborů pomocí funkce Najít?

  2. Jak nastavit subdoménu nebo hostit více domén pomocí nginx na linuxovém serveru

  3. Použití SNI k hostování více certifikátů SSL v Apache