Якщо виникла необхідність розміщення на Linux VPS сервері кількох сайтів, то Apache для цього надає можливість налаштування віртуальних хостів (virtual hosts). Віртуальні хости бувають двох видів: name-based virtual hosts, тобто прив’язані до доменного імені, та IP-based virtual hosts, тобто прив’язані до IP-адреси. Віртуальні хости першого типу використовують різні імена для однієї IP-адреси, а другого типу — різні IP-адреси. Створення віртуальних хостів в Apache необхідні, якщо на сервері є кілька сайтів, а їх налаштування необхідне для коректного відображення всіх сайтів.
Найбільш поширеним є використання віртуальних хостів на базі доменних імен (name-based virtual hosts), прив’язаних до однієї IP-адреси. Таким чином можна зберігати безліч сайтів на одному IP.
Найпростішим способом додавання та подальшого налаштування віртуальних хостів Apache є редагування конфігураційного файлу веб-сервера, який має різні назви та розташування залежно від операційної системи:
У Red-Hat/CentOS/Fedora:
/etc/httpd/conf/httpd.conf
Debian/Ubuntu :
/etc/apache2/apache2.conf
Другим способом налаштування є використання власних .conf файлів, які повинні розміщуватись за шляхом:
У Red-Hat/CentOS/Fedora:
/etc/httpd/conf.d/filename.conf
Debian/Ubuntu:
/etc/apache2/conf.d/filename.conf
Як правило, у конфігураційному файлі httpd.conf або apache2.conf розділ керування віртуальними хостами розташований у самому кінці. Для додавання віртуального хоста потрібно відкрити цей файл і розкоментувати в ньому (прибрати #) директиву NameVirtualHost *:80 (Аргумент * позначає всі імена хостів). Якщо використовуєте спосіб розміщення конфігурації в conf.d, вказану директиву не треба розкоментовувати, а слід визначити її в файлі, який створюється.
Після NameVirtualHost йде блок VirtualHost *:80 . Подібні блоки є конфігурацією ваших віртуальних хостів. Виглядає все це приблизно так:
NameVirtualHost *:80 <Directory var/www/> AllowOverride All Options All </Directory> <VirtualHost *:80> ServerAdmin username@site1.com DocumentRoot /var/www/site1.ru ServerName site1.ru ServerAlias www.site1.ru ErrorLog logs/site1.ru-error_log CustomLog logs/site1.ru-access_log common </VirtualHost> <VirtualHost *:80> ServerAdmin username@site2.org DocumentRoot /var/www/site2.ru ServerName site2.ru ServerAlias www.site2.ru ErrorLog logs/site2.ru-error_log CustomLog logs/site2.ru-access_log common </VirtualHost>
Саме тут і виконуються всі налаштування віртуальних хостів, а також підключення або вилучення певних опцій.
Розглянемо детальніше, за що відповідає кожна зазначена вище директива.
1. Директива ServerAdmin вказує електронну адресу адміністратора сервера, на яку надходять усі повідомлення з хоста щодо його адміністрування.
2. Директива DocumentRoot вказує кореневу директорію з файлами сайту, які мають видаватися веб-сервером клієнту (браузеру).
3. Директива Server Name визначає ім’я хоста, на запит якого повинні будуть видаватися файли, що містяться в DocumentRoot.
4. Директива ServerAlias задає альтернативні імена для хостів (аліасів, псевдонімів), на які він відкликається.
5. Директива ErrorLog визначає файли протоколів помилок для кожного хоста, а CustomLog — файли протоколів для всього іншого, крім помилок.
До блоків із віртуалхостами, як ви помітили, є ще запис:
<Directory var/www/> AllowOverride All </Directory>
У тегах <Directory> </Directory> полягає перелік директив (параметрів), які будуть застосовуватися до конкретної директорії, яка вказується у першому тегу. У прикладі вище — це var/www/.
Зазначена директива AllowOverride вказує, чи використовувати файли .htaccess і якщо так, то які глобальні директиви веб-сервера можна перевизначати в таких файлах. У наведеному вище прикладі значення AllowOverride встановлено All, що дозволяє обробляти файли .htaccess і всі зазначені у них директиви. Існують і інші можливі значення:
AuthConfig — дозволяє використовувати директиви авторизації (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require, і т.д.).
FileInfo — дозволяє використовувати директиви, що керують типами документів (AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority тощо).
Indexes — дозволяє використовувати директиви для керування індексацією каталогів (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName тощо).
Limit — дозволяє використовувати директиви керування доступом (allow, deny та order).
Options — дозволяє використовувати директиви, з допомогою яких можна керувати специфічними особливостями каталогу (Options і XBitHack).
Це одна з багатьох можливих директив, з якими ви можете ознайомитись на сайті розробників.
Після збереження змін у файлі необхідно перевірити нові настройки помилок. Для перевірки можна використовувати такі команди:
apachectl configtest apachectl -S apachectl -d
Якщо отримано повідомлення «Syntax OK», значить помилок немає і можна перезавантажувати веб-сервер, щоб застосували зміни. Зробити це можна за допомогою наступних команд:
Red-Hat/CentOS/Fedora:
service httpd restart
або
/etc/init.d/ httpd restart
Debian/Ubuntu:
service apache2 restart
або
/etc/init.d/apache2 restart
Далі ви можете зіткнутися з такою проблемою. При надходженні запиту Apache проходить по всьому списку віртуальних хостів у пошуках відповідного, і якщо не знаходить відповідності, видає перший по порядку хост. Щоб усунути цю неприємність, фахівці вигадали так звану секцію-заглушку, яку слід вставити перед першою секцією VirtualHost реального сайту. Виглядає вона приблизно так:
<VirtualHost *:80> ServerName default DocumentRoot /var/www/default </VirtualHost>
Таким чином, всі неправильні запити будуть надсилатися шляхом var/www/default, де можна створити індексну сторінку, яка буде повідомляти про неправильний запит.
Також Apache за замовчуванням не має доступу до ваших домашніх директорій, а лише до директорії /var/www . Якщо ви використовуєте на своєму сервері SElinux, то для надання Apache доступу до домашніх директорій використовуйте такі команди:
setsebool -P httpd_enable_homedirs 1
або
setsebool -P apache2_enable_homedirs 1
Для того, щоб Apache мав доступ до певної директорії, наприклад, до /home/mydir слід використовувати команду:
chcon -R -t httpd_sys_content_t /home/mydir
або
chcon -R -t apache2_sys_content_t /home/mydir
При вимкненому SELinux для надання Apache доступу до тієї чи іншої домашньої директорії сайту, вам потрібно буде вручну відредагувати його конфігураційний файл (/etc/httpd/conf/httpd.conf у CentOS/Fedora або /etc/apache2/apache2.conf у Debian/ Ubuntu).
Відкривши конфігураційний файл веб-сервера для редагування, знайдіть рядок DocumentRoot (при використанні редактора nano його можна знайти за допомогою комбінації клавіш Ctrl + W). Замініть значення в лапках /var/www/html на абсолютний шлях до домашньої директорії сайту (наприклад, /home/username/site.com). Збережіть зміни та вийдіть з меню редактора (Ctrl+O та Ctrl+X). Перезапустіть Apache.
Якщо у вас на VPS встановлена ОС Debian/Ubuntu, правити рядок DocumentRoot необхідно у файлі /etc/apache2/sites-available/default. Відкрийте його для редагування та замініть стандартне значення /var/www на абсолютний шлях до домашньої директорії сайту. Перезапустіть веб-сервер.
На цьому базове налаштування віртуальних хостів закінчено.