Последна актуализация на: 21.09.2016
Автор: Rackspace Support
Повечето хора обслужват повече от един домейн на облачния си сървър. Независимо дали обслужвате различни домейни или различни поддомейни на един и същи домейн, процедурата е същата. Тази статия описва как да създавате виртуални хостове за обслужване на множество домейни и как да отстранявате проблеми с конфигурации на виртуални хостове, базирани на имена на Apache.
Когато браузър изпрати заявка до IP адреса на вашия сървър с искане за съдържанието на името на вашия домейн (например https://yourexampledomain.com), вашият уеб сървърът обслужва HTTP представяне на вашия сайт. Ако сървърът обслужва само един уебсайт, той обслужва HTML във вашата /var/www/html директория, започвайки с index.html. Но наличието на уникален сървър за всеки уебсайт, който искате да обслужвате, е скъпо и неефективно използване на вашите ресурси.
Базираните на имена виртуални хостове ви позволяват да обслужвате съдържание за множество уебсайтове от един сървър.
Един от първите редове във всеки конфигурационен файл на виртуален хост указва името на домейна, което е свързано с виртуалния хост. Следва примерна конфигурация на виртуален хост за Apache, обслужващ domain1.com:
ServerNamedomain1.comServerAlias www.domain1.comСледният пример показва конфигурация на виртуален хост за NGINX:
сървър {server_namewww.domain1.com;rewrite ^/(.\*) https://domain1.com/$1 permanent;Всяка конфигурация започва малко по-различно, но се прилага същият принцип: този конкретен виртуален хост отговаря на заявки за domain1.com и www.domain1.com.
За да обслужвате различно съдържание за различни домейни, вие добавяте друг виртуален хост.
Например имате поддомейн, наречен blog.domain1.com, който обслужва блог.
Първо създавате папка във вашата папка public_html със съответните файлове за блога (например инсталация на WordPress).
След това създавате виртуален хост с server_name или ServerName, посочени като blog.domain1.com, и го конфигурирате да сочи към файловете и папките на блога във вашата папка public_html.
За повече информация относно виртуалните хостове използвайте документа на Apache Виртуални хостове с база имена
Този раздел ви показва как да отстранявате проблеми с конфигурации на виртуален хост, базирани на имена на Apache. Той предоставя полезни команди за тестване на вашата конфигурация на виртуален хост, описва как да интерпретирате изхода им и описва как те помагат за коригиране на общи проблеми с конфигурацията на виртуален хост.
Рестартирайте ApacheПреди да можете да диагностицирате проблем, уверете се, че сте рестартирали Apache след последния път, когато сте направили промени във вашите конфигурационни файлове на Apache:
За дистрибуции на Red Hat използвайте:
sudo /usr/sbin/httpd -k restartЗа дистрибуции на Debian използвайте:
sudo /usr/sbin/apache2 -k restartАко Apache ви даде предупреждение или съобщение за грешка, отбележете го за по-късно. Следващата ви стъпка е да получите информация за конфигурацията на виртуалния хост.
Вземете отчет за конфигурацияИзпълнете командата -S на уеб сървъра, за да проверите конфигурацията на вашия виртуален хост
За дистрибуции, извлечени от Red Hat, използвайте:
sudo /usr/sbin/httpd -SЗа извлечени от Debian дистрибуции използвайте:
sudo /usr/sbin/apache2 -SИзходът показва настройките на виртуалния хост от конфигурационния файл. Следващият пример показва конфигурационния отчет за сървър, конфигуриран с два базирани на имена виртуални хоста: vh1.example.com и vh2.example.com. Номерираните редове са обяснени след примера.
Конфигурация на VirtualHost:заместващ знак NameVirtualHosts и \_default\_ сървъри:[1] \*:80is a NameVirtualHost[2] сървър по подразбиране vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)[3] порт 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)[4] порт 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8 )[5] Синтаксис OKРед [1] съобщава, че уеб сървърът слуша на порт по подразбиране 80 за всички IP адреси, които Apache слуша, и че базираният на имена виртуален хостинг е включен. * е заместващ знак, указващ всички IP адреси.
Ред [2] отчита виртуалния хост по подразбиране, който уеб сървърът псевдоним на сървъра за всички заявки, за които не е поискано конкретно име на хост. Той също така показва пътя до конфигурационния файл и номера на реда, където е зададена тази конфигурация.
Ред [3] съобщава порта и името на първата намерена конфигурация на виртуален хост, файла, в който е конфигуриран, и номера на реда, от който започва конфигурацията му.
Ред [4] съобщава порта и името на втората намерена конфигурация на виртуален хост, файла, в който е конфигуриран, и номера на реда, от който започва конфигурацията му.
Ред [5] съобщава дали синтаксисът на конфигурацията е правилен, въпреки че това не означава непременно, че вашият сайт работи
Следният изход е произведен от следната файлова конфигурация на виртуален хост:
NameVirtualHost \*:80 Включва базирана на имена хост резолюция и свързва виртуалния сървър с IP адреси и портове, както в [1] по-горе. \* е заместващ знак, указващ всички IP адреси. Конфигурира първия виртуален хост по подразбиране в [2] & [3] по-горе. Това е по подразбиране, защото е първият виртуален хост, чийто IP и порт съвпадат с тези в директивата NameVirtualHost преди него.ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1 Конфигурира втория виртуален хост в [4] по-горе.ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Сега, след като видяхте как изглежда основната конфигурация на виртуален хост и как тя се свързва със собствения отчет за конфигурация на Apache, можете да използвате тези отчети, за да разгледате често срещани проблеми с конфигурацията . Следващите раздели описват някои от тези проблеми и предоставят насоки как да ги коригирате.
Хостове, които не са настроени като базирани на имена виртуални хостовеАко се изпълнява httpd -S отчита следното предупреждение:
[Сряда, 18 май 15:24:51 2011 г.] [предупреждение] \_default\_ VirtualHost припокриване на порт 80, първият има приоритетVirtualHost configuration:wildcard NameVirtualHosts и \_default\_ сървъри:\*:80 vh1.example.com (/ etc/httpd/conf/custom/virtualhost.conf:3)\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)Синтаксис OKТова предупреждение показва, че множество виртуални хостовете се опитват да използват един и същ „сокет“, без да са настроени като базирани на имена виртуални хостове. Тази грешка често възниква, когато за първи път се създават виртуални хостове на Apache, тъй като директивата NameVirtualHost по подразбиране е коментирана с хеш символ. Този символ инструктира Apache да игнорира директивата.
За да коригирате този проблем в конфигурационен файл на Apache по подразбиране, проверете дали директивата NameVirtualHost *:80 не е коментирана. Ако работите с минимален конфигурационен файл на Apache, добавете директива NameVirtualHost *:80 над отделните конфигурации на виртуален хост.
Следният пример показва коментираната директива, която е причинила грешката:
#NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Element липсва от директивата VirtualHostАко се изпълнява httpd -S съобщава следното съобщение за грешка:
Синтаксична грешка на ред 8 на /etc/httpd/conf/custom/virtualhost.conf: директивата изисква допълнителни аргументиТова съобщение означава, че в директивата VirtualHost на виртуалния хост липсва необходим елемент. Директивата VirtualHost е първият ред на всяка индивидуална конфигурация на виртуален хост. В този случай грешката е на ред 8 на конфигурационния файл /etc/httpd/conf/custom/virtualhost.conf.
Следва конфигурацията на Apache, която доведе до тази грешка по-горе:
NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Имайте предвид, че втората директива VirtualHost няма указан IP адрес или порт, което е причината за грешката.
Следва коригирана версия на предходния пример с добавяне на \*:80 към директивата на виртуалния хост. Както винаги, \* е заместващ знак, указващ всички IP адреси.
NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2 Номерата на портовете не съвпадатАко се изпълнява httpd -S, показва, че виртуален хост е посочено по-горе е ред NameVirtualHost:
Конфигурация на VirtualHost:заместващ знак NameVirtualHosts и \_default\_ сървъри:\*:800vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)\*:80 е NameVirtualHost сървър по подразбиране vh1.example.com ( /etc/httpd/conf/custom/virtualhost.conf:3)порт 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)Синтаксис OKВ този пример конфигурацията test отчита конфигурацията vh2.example.com, преди да отчете конфигурацията NameVirtualHost. Може да видите тази грешка, ако IP адресът или портът на VirtualHost не съответства на IP адреса или порта на директивата NameVirtualHost на уеб сървъра. В този пример отчетът показва, че vh2.example.com използва порт 800, а не порт 80. Номерът на порта е въведен неправилно, когато е конфигуриран слушащият порт на виртуалния хост vh2.example.com. В резултат на това Apache третира vh2.example.com като отделен виртуален хост, базиран на порт.
Тестовата команда httpd -S не ви предупреждава за този проблем, тъй като е позволено да конфигурирате виртуални хостове да използват всеки порт, като например 800, без те да са част от базираната на имена конфигурация на виртуален хост на същия сървър.
Ако срещнете тази грешка, вероятно ще видите съдържание от виртуалния хост по подразбиране (vh1.example.com в този пример), когато се опитате да видите сайта във вашия уеб браузър.
За да ви помогнем да картографирате предходния изход към неговия конфигурационен файл, по-долу е конфигурацията на виртуален хост, която създаде тази грешка:
NameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot /var/www/vhosts/vh2Document главната директория не съществуваАко изпълнява httpd -S съобщава следната грешка:
Предупреждение: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] не съществуваТази грешка показва, че директорията, посочена като съдържаща файловете на уебсайта за виртуалния хост vh2.example.com, не съществува или че Apache няма достъп до него. Подобни грешки могат да се появят за всеки от файловите пътища, посочени в конфигурацията на виртуален хост, като пътищата към регистрационните файлове на виртуалния хост.
За да коригирате тази грешка, уверете се, че сте създали директорията. Ако сте го създали, проверете дали няма грешки в директивата DocumentRoot. Често срещана грешка е да се пропусне първоначалната наклонена черта на пътя (/). Изоставянето на наклонената черта инструктира Apache да прочете пътя – пътя на DocumentRoot в този случай – като относителен път, тоест като път спрямо пътя на ServerRoot на основната конфигурация на Apache.
Следният пример показва само един от начините, по които се създава тази грешка. Пътят за директивата DocumentRoot в първия виртуален хост започва с наклонена черта, но вторият не започва.
ServerRoot /etc/httpdNameVirtualHost \*:80ServerName vh1.example.comDocumentRoot /var/www/vhosts/vh1ServerName vh2.example.comDocumentRoot var/www/vhosts/vh2Използване на cURL за тестване на вашия сайтСлед като проверите конфигурационните файлове на виртуалния хост и командата httpd -S не съобщава за проблеми, опитайте да получите достъп до вашия сайт чрез cURL:
curl -I www.example.comРезултатът трябва да изглежда нещо подобно:
HTTP/1.1 200 OK Дата: събота, 07 май 2011 г. 15:09:50 GMTServer: Apache/2.2.3 (CentOS) Последна промяна: понеделник, 25 април 2011 г. 11:07:43 GMTETag: "2c32e-77-4a1bc37723dc0"Приемам -Диапазони: bytesContent-Length: 119Content-Type: text/html; charset=UTF-8Първият ред показва кода на състоянието. Искате да видите 200 OK, както е показано в примера. Ако това е, което виждате, тествайте уеб сървъра с браузъра си, но помислете, че браузърът ви може да показва кеширана страница.
Ако не виждате 200 OK, може да видите едно от следните често срещани съобщения:
curl: (6) Не може да разреши хост vh1.example.com
Ако cURL съобщи, че не може да намери хоста, проверете дали има запис A за домейна, който сочи към правилния IP адрес за вашия сървър. Можете да използвате dig, за да направите това:
dig vh1.example.comcurl: (7) не можа да се свърже с хоста
Проверете дали вашите конфигурационни файлове на Apache включват необходимите директиви за слушане и че не са коментирани. Нуждае се поне от Listen 80.
Друг начин да проверите това е да проверите регистъра на грешките. Регистърът на грешките по подразбиране е /var/log/httpd/error_log на Red Hat системи и /var/log/apache2/error_log на Debian системи. Ако не е посочен порт, който да слуша Apache, съобщението няма налични гнезда за слушане, изключването следва опита на Apache да се рестартира.
[известие] SIGHUP получен. Опит за рестартиране, няма налични гнезда за слушане, изключване Невъзможно отваряне на регистрационни файловеHTTP/1.1 403 Забранено
Този отговор показва, че разрешенията, които позволяват достъп на Apache до страницата, която искате, не са правилни. Може би разрешенията на директорията са неправилни или това може да е самата страница.
Може също да видите отговор 403 в следните ситуации:
- `DocumentRoot` не съдържа индексен файл — обикновено се нарича `index.html` или `index.php`. Обърнете внимание, че името на файла е чувствително към главни и малки букви.- Виртуалният хост не съдържа директива `DirectoryIndex`, указваща индексния файл по подразбиране.Регистрите за грешки на Apache обикновено показват коя директория или файл има разрешенията, зададени неправилно. Индивидуалните виртуални хостове може да записват грешки в собствените си регистрационни файлове, ако са били конфигурирани така, така че проверете и тези регистрационни файлове.
Не се обезсърчавайте от количеството данни в регистрационните файлове на натоварения сървър. Вместо това използвайте командата tail, за да прегледате избирателно само последните десет реда от дневника. Например:
tail /var/log/apache2/error\_logМожете да видите новите записи, когато се добавят към регистъра на грешките, или който и да е журнал, докато тествате сървъра, ако инструктирате командата tail да „следва“ журнала. Например:
tail -f /var/log/httpd/error\_logСледват примери за някои често срещани грешки в конфигурацията, свързани с разрешенията, които могат да се появят в регистрационните файлове на Apache:
Следният запис в регистрационния файл показва, че разрешенията за файла index.html за vh2.example.com отказват достъп до Apache.
[грешка] [клиент 203.0.113.96] (13) Разрешението е отказано: достъпът до /index.html е отказанСледният запис в регистрационния файл показва, че разрешенията за директорията /var/www/vhosts/vh2 блокират заявката за четене на Apache.
[грешка] [клиент 203.0.113.96] (13) Разрешението е отказано: разрешенията за файлове отказват достъп до сървъра: /var/www/vhosts/vh2/index.htmlСледният запис в регистрационния файл показва, че Apache няма разрешения за изпълнение или четене на една от директориите над DocumentRoot.
[грешка] [клиент 203.0.113.96] (13) Разрешението е отказано: достъп до / отказан