How-to`s — HTTP-сервер: виртуальные хосты быстро и просто
Преимущества описываемого решения
1) Нет необходимости менять конфигурацию сервера при добавлении и удалении новых хостов.
2) Добавлять/удалять хосты можно "на лету", без перезапуска сервера.
Как это работает
При выполнении HTTP-запроса клиент передаёт серверу заголовок Host, содержащий имя хоста. Сервер ищет подкаталог с таким именем в указанном в конфиге каталоге. Если такой каталог существует, он принимается в качестве корневого. Если нет - в зависимости от настроек показывается хост по умолчанию или возвращается ошибка (например, 404).
Настройка для Apache
У этого индейца для наших целей есть амулет под названием mod_vhost_alias. Его надо навесить на апача. Как это делается, рассказывать не буду, способов множество в зависимости от вашего дистрибутива и версии краснокожего. Главное для нас то, что он добавляет в пространство имён конфигурационных директив две волшебные штучки: VirtualDocumentRoot и VirtualScriptAlias.
Для начала надо запретить апачу редирект на "каноническое имя" ServerName, иначе амулет не сработает.
UseCanonicalName Off
Простейшим случаем будет, например, такая настройка:
VirtualDocumentRoot /srv/www/vhosts/%0
Вместо %0 апач подставит пришедший ему HTTP-заголовок Host и будет искать корневые каталоги в /srv/www/vhosts.
Я обычно делаю так:
1 2 |
VirtualDocumentRoot /srv/www/vhosts/%0/htdocs |
Это позволяет для каждого виртуального хоста иметь как обычный корневой каталог, так и отдельный каталог для cgi-скриптов.
Псевдонимы хостов (например, www.domain.tld для domain.tld) легко делать при помощи символических ссылок. Иногда после этого апачу требуется объяснять, что по ссылкам ходить всё-таки можно и это совсем не больно:
1 2 3 |
<Directory /srv/www/vhosts/> |
Зачастую требуется назначить какие-то опции сразу всем виртуальным хостам. Это можно делать так:
1 2 3 |
<Directory /srv/www/vhosts/%0/htdocs> |
Тут мы разрешили переопределять любые настройки в файлах .htaccess, которые лежат в соответствующих каталогах виртуальных хостов.
Можно, конечно, использовать и более сложную структуру каталогов, чтобы не сваливать все хосты в одну кучу. Разделить по первым буквам, TLD, или вовсе выстроить их в дерево. Однако мне кажется, что если вам это понадобилось, вы наверняка владелец крупной хостинговой площадки и достаточно опытный админ, чтобы прочитать документацию.
Настройка для lighttpd
На моих серверах я обычно применяю именно этот http-сервер, так как он потрясающе лёгок и быстр. Из недостатков у него разве что отсутствие поддержки файлов .htaccess, но у него есть свои средства управления, с другим синтаксисом. С PHP он легко сращивается при помощи FastCGI, таким образом без проблем заменяя популярную связку Apache+nginx. Но мы сейчас не об этом.
У этого сервера есть аж целых три модуля для реализации разного рода виртуального хостинга, но мне лично всегда хватало одного: mod_simple_vhost. Это совсем просто:
1 2 3 4 5 |
var.vhosts_dir = "/srv/www/vhosts" |
В этом примере мы загрузили модуль [2], определили каталог, где нужно искать корневые каталоги хостов [1,3,4], и хост по умолчанию ([5], если запрошенного хоста не существует или, не приведи Аллах, заголовок Host не пришёл). Путь к нужному каталогу формируется так: server-root + Host + document-root.
Собственно, и всё с этим модулем. Ну а если понадобится что-то более навороченное - тут я вас опять отошлю к документации.