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 toListen 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
Běžné chyby související s oprávněními
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 provh2.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