Poslední aktualizace: 2016-09-21
Autor: podpora Rackspace
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.
Když prohlížeč odešle požadavek na adresu IP vašeho serveru s dotazem na obsah názvu vaší domény (například https://yourexampledomain.com), váš web server poskytuje HTTP reprezentaci vašeho webu. Pokud server obsluhuje pouze jeden web, obslouží HTML ve vašem adresáři /var/www/html počínaje 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é založené na názvech vám umožňují poskytovat obsah pro více webových stránek z jednoho serveru.
Jeden z prvních řádků v 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 obsluhující domain1.com:
ServerNamedomain1.comServerAlias www.domain1.comNásledující příklad ukazuje konfiguraci virtuálního hostitele pro NGINX:
server {server_namewww.domain1.com;rewrite ^/(.\*) https://domain1.com/$1 permanent;Každá konfigurace začíná trochu jinak, ale platí stejný princip: daný virtuální hostitel odpovídá na dotazy pro 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 ve složce public_html vytvořte složku s příslušnými soubory pro blog (například instalace WordPressu).
Potom vytvoříte virtuálního hostitele s názvem_serveru nebo názvem_serveru zadaným jako blog.domain1.com a nakonfigurujete jej tak, aby odkazoval na soubory a složky blogu ve vaší složce public_html.
Další informace o virtuálních hostitelích naleznete v dokumentu Apache Virtuální hostitelé s bází názvů
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 ApacheNež 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 restartPro distribuce Debianu použijte:
sudo /usr/sbin/apache2 -k restartPokud vám Apache zobrazí varování nebo chybovou zprávu, poznamenejte si to později. Dalším krokem je získání informací o konfiguraci virtuálního hostitele.
Získejte sestavu konfiguraceSpusťte na webovém serveru příkaz -S a zkontrolujte konfiguraci virtuálního hostitele
Pro distribuce odvozené od Red Hatu použijte:
sudo /usr/sbin/httpd -SPro distribuce odvozené z Debianu použijte:
sudo /usr/sbin/apache2 -SVý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.
Konfigurace VirtualHost: název zástupné kartyVirtualHosts a \_default\_ servery:[1] \*:80je výchozí server NameVirtualHost[2] 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] Syntaxe OKŘádek [1] hlásí, že webový server naslouchá na výchozím portu 80 pro všechny IP adresy, kterým Apache naslouchá, 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] hlásí výchozího virtuálního hostitele, kterým je 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 syntaxe konfigurace 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 Zapne rozlišení hostitele založené na názvu a sváže virtuální server s IP adresami a porty jako v [1] výše. \* je zástupný znak určující všechny IP adresy. Nakonfiguruje prvního a výchozího virtuálního hostitele v [2] & [3] výše. Je výchozí, protože se jedná o prvního virtuálního hostitele, jehož IP a port se shodují s těmi v direktivě NameVirtualHost před ním.ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1 Konfiguruje druhého virtuálního hostitele v [4] výše.ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Nyní, když jste viděli základní konfiguraci virtuálního hostitele a jak se mapuje 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í pokyny, jak je vyřešit.
Hostitelé nejsou nastaveni jako virtuální hostitelé podle názvuPři spuštění httpd -S se zobrazí následující varování:
[St May 18 15:24:51 2011] [warn] \_default\_ VirtualHost se překrývá na portu 80, první má přednost Konfigurace virtuálního hostitele: zástupný názevVirtualHosts a \_default\_ servery:\*:80 vh1.example.com (/ etc/httpd/conf/custom/virtualhost.conf:3)\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)Syntaxe OKToto varování znamená, že několik virtuálních hostitelé se pokoušejí 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í direktiva NameVirtualHost 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 direktiva NameVirtualHost *:80 není zakomentována. Pokud pracujete s minimálním konfiguračním souborem Apache, přidejte nad jednotlivé konfigurace virtuálního hostitele direktivu NameVirtualHost *:80.
Následující příklad ukazuje direktivu s komentářem, která způsobila chybu:
#NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Element chybí v direktivě VirtualHostPokud spustíte httpd -S, zobrazí se následující chybová zpráva:
Chyba syntaxe na řádku 8 /etc/httpd/conf/custom/virtualhost.conf: direktiva vyžaduje další argumentyTato zpráva znamená, že v direktivě VirtualHost virtuálního hostitele chybí nezbytný prvek. Direktiva VirtualHost je první řádek každé individuální 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 \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Všimněte si, že druhá direktiva VirtualHost nemá zadanou IP adresu ani port, což je příčina chyby.
Následující je opravená verze předchozího příkladu s přidáním \*:80 do direktivy virtuálního hostitele. Jako vždy je \* zástupný znak určující všechny IP adresy.
NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Port čísla se neshodujíPokud spustíte httpd -S, znamená to, že virtuální hostitel je uveden výše a je řádek NameVirtualHost:
Konfigurace virtuálního hostitele: název zástupné kartyVirtualHosts a \_default\_ servery:\*:800vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)\*:80 je server NameVirtualHostdefault vh1.example.com ( /etc/httpd/conf/custom/virtualhost.conf:3)port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)Syntaxe OKV tomto příkladu je konfigurace test hlásí konfiguraci vh2.example.com dříve, než hlásí konfiguraci NameVirtualHost. Tato chyba se může zobrazit, pokud IP adresa nebo port VirtualHost neodpovídá IP adrese nebo portu direktivy NameVirtualHost webového serveru. V tomto příkladu sestava ukazuje, že vh2.example.com používá port 800 místo portu 80. Číslo portu bylo zadáno špatně, když byl konfigurován naslouchací port virtuálního hostitele vh2.example.com. V důsledku toho Apache považuje vh2.example.com za samostatný virtuální hostitel založený na portu.
Příkaz httpd -S test vás na tento problém neupozorní, protože je možné 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ě se vám při pokusu o zobrazení webu ve webovém prohlížeči zobrazí obsah z výchozího virtuálního hostitele (v tomto příkladu vh1.example.com).
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 \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Document kořenový adresář neexistujePokud spustíte httpd -S ohlásí následující chybu:
Upozornění: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] neexistujeTato chyba znamená, že adresář určený jako obsahující soubory webu pro virtuálního hostitele vh2.example.com neexistuje nebo že Apache k němu 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 direktivě DocumentRoot nejsou žádné chyby. Častou chybou je vynechat počáteční lomítko cesty (/). Vynecháním lomítka dá Apache pokyn, aby četl cestu – v tomto případě cestu DocumentRoot – jako relativní cestu, tedy jako cestu relativní k cestě ServerRoot hlavní konfigurace Apache.
Následující příklad ukazuje pouze jeden ze způsobů, jak se tato chyba vytváří. Cesta k direktivě DocumentRoot v prvním virtuálním hostiteli začíná lomítkem, ale u druhého nikoli.
ServerRoot /etc/httpdNameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot var/www/vhosts/vh2Použití cURL k testování vašeho webuPo kontrole konfiguračních souborů virtuálního hostitele a příkaz httpd -S nehlásí žádné problémy, zkuste se na svůj web dostat pomocí cURL:
curl -I www.example.comVýstup by měl vypadat nějak takto:
HTTP/1.1 200 OKDate: So, 07 May 2011 15:09:50 GMTServer: Apache/2.2.3 (CentOS) Last-Modified: Mon, 25 April 2011 11:07:43 GMTETag: "2c32e-7cdc3704a" -Rozsahy: bytesContent-Length: 119Content-Type: text/html; charset=UTF-8První řádek zobrazuje stavový kód. Chcete vidět 200 OK, jak je znázorně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ůže se vám zobrazit jedna z následujících běžných zpráv:
curl: (6) Nelze vyřešit hostitele vh1.example.com
Pokud cURL hlásí, že nemůže najít hostitele, ověřte, zda pro doménu existuje záznam A, který ukazuje na správnou IP adresu vašeho serveru. K tomu můžete použít dig:
dig vh1.example.comcurl: (7) se nepodařilo připojit k hostiteli
Ověřte, že vaše konfigurační soubory Apache obsahují potřebné direktivy Listen a že nejsou zakomentovány. Potřebuje to Listen 80 minimálně.
Dalším způsobem, jak to ověřit, je zkontrolovat protokol chyb. Výchozí protokol chyb je na /var/log/httpd/error_log na systémech Red Hat a /var/log/apache2/error_log na systémech Debian. Pokud není zadá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.
[upozornění] SIGHUP přijato. Při pokusu o restartování nejsou k dispozici žádné naslouchací sokety, vypnutí Nelze otevřít protokolyHTTP/1.1 403 Zakázáno
Tato odpověď znamená, že oprávnění umožňující 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 se také může zobrazit v následujících situacích:
- `DocumentRoot` neobsahuje žádný indexový soubor – obvykle pojmenovaný `index.html` nebo `index.php`. Všimněte si, že název souboru rozlišuje velká a malá písmena.- Virtuální hostitel neobsahuje direktivu `DirectoryIndex` určující výchozí soubor indexu.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 byli nakonfigurováni, takže 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\_logPokud dáte příkazu tail „následovat“ protokol, můžete při testování serveru vidět nové položky při jejich přidávání do protokolu chyb nebo jakéhokoli protokolu. Například:
tail -f /var/log/httpd/error\_logNíž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í k souboru index.html pro vh2.example.com zakazují přístup k Apache.
[chyba] [klient 203.0.113.96] (13)Oprávnění odepřeno: přístup k /index.html odepřenNásledující záznam protokolu ukazuje, že oprávnění v adresáři /var/www/vhosts/vh2 blokují požadavek Apache na čtení.
[chyba] [klient 203.0.113.96] (13)Oprávnění odepřeno: oprávnění k souboru zakazují přístup serveru: /var/www/vhosts/vh2/index.htmlNásledující záznam protokolu ukazuje, že Apache nemá oprávnění ke spouštění ani ke čtení jeden z adresářů nad DocumentRoot.
[chyba] [klient 203.0.113.96] (13)Povolení odepřeno: přístup k / odepřen