Якщо виникла необхідність розміщення на 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 на абсолютний шлях до домашньої директорії сайту. Перезапустіть веб-сервер.

На цьому базове налаштування віртуальних хостів закінчено.