m0Ray 23.11.2010 14:45

How-to`sHTTP-сервер: виртуальные хосты быстро и просто

Преимущества описываемого решения


1) Нет необходимости менять конфигурацию сервера при добавлении и удалении новых хостов.
2) Добавлять/удалять хосты можно "на лету", без перезапуска сервера.

Как это работает


При выполнении HTTP-запроса клиент передаёт серверу заголовок Host, содержащий имя хоста. Сервер ищет подкаталог с таким именем в указанном в конфиге каталоге. Если такой каталог существует, он принимается в качестве корневого. Если нет - в зависимости от настроек показывается хост по умолчанию или возвращается ошибка (например, 404).

Настройка для Apache


У этого индейца для наших целей есть амулет под названием mod_vhost_alias. Его надо навесить на апача. Как это делается, рассказывать не буду, способов множество в зависимости от вашего дистрибутива и версии краснокожего. Главное для нас то, что он добавляет в пространство имён конфигурационных директив две волшебные штучки: VirtualDocumentRoot и VirtualScriptAlias.

Для начала надо запретить апачу редирект на "каноническое имя" ServerName, иначе амулет не сработает.
1
UseCanonicalName Off



Простейшим случаем будет, например, такая настройка:
1
VirtualDocumentRoot /srv/www/vhosts/%0


Вместо %0 апач подставит пришедший ему HTTP-заголовок Host и будет искать корневые каталоги в /srv/www/vhosts.

Я обычно делаю так:
1
2
VirtualDocumentRoot /srv/www/vhosts/%0/htdocs
VirtualScriptAlias /srv/www/vhosts/%0/cgi-bin


Это позволяет для каждого виртуального хоста иметь как обычный корневой каталог, так и отдельный каталог для cgi-скриптов.

Псевдонимы хостов (например, www.domain.tld для domain.tld) легко делать при помощи символических ссылок. Иногда после этого апачу требуется объяснять, что по ссылкам ходить всё-таки можно и это совсем не больно:
1
2
3
<Directory /srv/www/vhosts/>
Options FollowSymLinks
</Directory>



Зачастую требуется назначить какие-то опции сразу всем виртуальным хостам. Это можно делать так:
1
2
3
<Directory /srv/www/vhosts/%0/htdocs>
AllowOverride All
</Directory>


Тут мы разрешили переопределять любые настройки в файлах .htaccess, которые лежат в соответствующих каталогах виртуальных хостов.

Можно, конечно, использовать и более сложную структуру каталогов, чтобы не сваливать все хосты в одну кучу. Разделить по первым буквам, TLD, или вовсе выстроить их в дерево. Однако мне кажется, что если вам это понадобилось, вы наверняка владелец крупной хостинговой площадки и достаточно опытный админ, чтобы прочитать документацию.

Настройка для lighttpd


На моих серверах я обычно применяю именно этот http-сервер, так как он потрясающе лёгок и быстр. Из недостатков у него разве что отсутствие поддержки файлов .htaccess, но у него есть свои средства управления, с другим синтаксисом. С PHP он легко сращивается при помощи FastCGI, таким образом без проблем заменяя популярную связку Apache+nginx. Но мы сейчас не об этом.

У этого сервера есть аж целых три модуля для реализации разного рода виртуального хостинга, но мне лично всегда хватало одного: mod_simple_vhost. Это совсем просто:
1
2
3
4
5
var.vhosts_dir = "/srv/www/vhosts"
server.modules += ( "mod_simple_vhost" )
simple-vhost.server-root = vhosts_dir + "/"
simple-vhost.document-root = "/"
simple-vhost.default-host = "domain.tld"


В этом примере мы загрузили модуль <2>, определили каталог, где нужно искать корневые каталоги хостов <1,3,4>, и хост по умолчанию (<5>, если запрошенного хоста не существует или, не приведи Аллах, заголовок Host не пришёл). Путь к нужному каталогу формируется так: server-root + Host + document-root.

Собственно, и всё с этим модулем. Ну а если понадобится что-то более навороченное - тут я вас опять отошлю к документации.


Тэги: apache dynamic virtual hosting http lighttpd mass virtual hosting virtual hosting
+ 15 -
Похожие Поделиться

DEViANCE 23.11.2010 15:12 #
Для полноты не хватает nginx.
xamster 23.11.2010 15:16 #
http://wiki.enchtex.info/howto/gentoo/webserver#%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_nginx
xamster 23.11.2010 15:16 #
Сорри, забыл про тег.
Настройка для nginx
DEViANCE 23.11.2010 15:30 #
Лично мне оно ни к чему :) Я и так знаю, как настроить nginx. Это я писал автору, чтобы добавил в пост, мало ли кому-то пригодится. :)
m0Ray 23.11.2010 22:29 #
Так, собственно, при использовании lighttpd nginx нафиг не нужен.
DEViANCE 23.11.2010 23:31 #
Так, собственно, при использовании nginx на фиг не нужен lighttpd :)

Сам лично юзаю nginx + php-fpm.
DEViANCE 23.11.2010 23:32 #
Забыл уточнить, что и в том, и в другом случае Апач тем более не нужен :)
bosha 24.11.2010 00:02 #
Спорное утверждение. Недавно знакомые тесты различные проводили и оказалось что во многих случаях связка nginx+apache2 быстрее чем nginx+php-fpm.
m0Ray 24.11.2010 00:07 #
Интересно было бы сравнить бенчмарки с аналогичными в лайти.
bosha 24.11.2010 00:15 #
Ну, точных цифр я не помню, но помню что лайти смог обрабатывать только 37 запросов в секунду, против nginx+apache за 100 или даже 200 запросов в секунду. Помню что намного больше.В общем, всё это легко проверяется с помощью ab.
m0Ray 24.11.2010 00:25 #
А настройки? FastCGI тоже бывает весьма узким местом.
bosha 24.11.2010 09:58 #
Что настройки? Понятное дело что бывает. В том-то и дело что в апаче mod_php и даже с ним оказалось быстрее.
m0Ray 24.11.2010 11:27 #
Ну mod_php вообще быстрее по определению. Одна беда - нормально работает только с prefork MPM, а это - память...
bosha 24.11.2010 16:33 #
можно ограничить кол-во. prefork процессов примерно до двух(лучше подстроить под свои нужды). Я собственно так и сделал. На моей VDS'ке из 700Мб занято в редких случаях 400Мб, а там крутится далеко не один сайт ;)
bosha 24.11.2010 16:34 #
Вообще советую на эту тему почитать у juev'а - juev.ru. Он не так давно довольно немало статей написал на тему оптимизации VPS'ки.
m0Ray 24.11.2010 00:06 #
Это уже дело вкуса.
Просто у nginx я не увидел эффективных (то есть как минимум простых в развёртывани) способов связки с PHP/Ruby/etc... Мож я и тупой, конечно...
Ну а апач тяжёл, и это у него не отнять.
xT 23.11.2010 22:40 #
для полноты надо убрать apache : ) оставить nginx, php-fpm и varnish
m0Ray 24.11.2010 00:19 #
Апач популярен, а nginx, имхо, не очень функционален. Спаривать их иногда полезно для уменьшения использования оперативки сервера, но это всё равно полумеры.
Краснокожего себе можно позволить, если оперативка измеряется десятками гигабайт. В иных случаях, как мне кажется, лайти заменит и nginx, и индейца.
xT 24.11.2010 18:12 #
Апач популярен, а nginx, имхо, не очень функционален.
хорошее сравнение : )
evg 23.11.2010 15:19 #
Спасибо, только вчера с этим разобрался
immortalday 23.11.2010 15:22 #
а выкинуть апач в chroot не? если не то почему? в случае его компрометации основная система таки не пострадает.
m0Ray 23.11.2010 22:31 #
Я рассмотрел настройку только виртуального хостинга. Опишите настройку chroot jail в соответствующем посте, вам все карты в руки.
goblinyara 23.11.2010 17:53 #
сразу извиняюсь за, быть может, глупый вопрос, но разве в апаче sites-available/sites-enable не для этого же?
immortalday 23.11.2010 17:59 #
"в каталоге /etc/apache2/sites-available находятся файлы конфигурации хостов, а в /etc/apache2/sites-enabled находятся символические ссылки на файлы конфигурации /etc/apache2/sites-available, включенных хостов."
m0Ray 23.11.2010 22:40 #
Я рассматривал конфигурацию апача вообще. То, что вы описываете, это уже какие-то заточки конкретного дистрибутива.
Я сам в openSuSE (которую использую в качеcтве основного инструмента) вижу подобные подходы к конфигурированию. Например, сервер в основном конфиге инклюдит файлы из подкаталога conf.d, а там каждый модуль описан отдельным файлом. Это нормально.
Здравомыслящий админ сделает из этого поста отдельный файлик в conf.d и сделает всё так, чтобы изменения были отключаемы. Ну а для девелоперской песочницы вообще неважно, где в конфиге это будет прописано.
Ну и наконец вот что: у вас там конфиги, которые для их применения требуют перезагрузки сервера. А описанное решение работает динамически во время непрерывной работы сервера.
xT 23.11.2010 22:40 #
привет debian-like системы
Slimy 10.01.2011 16:00 #
Вопрос такой как сделать хосты чтобы создавались при создании нового проекта? Т.е. ваш путь всеравно предполагает ползать в hosts как минимум. Это в общем даже не проблема конкретно сервера, но некоторые фреймфорки рнр не хотят нормально работать пока их в хост не запиахаешь, это так по мудацки неудобно для разработки что просто удивительно что нет решения нормального.
m0Ray 10.01.2011 16:02 #
Не предполагает ни разу. Зачем вообще трогать hosts?
Slimy 10.01.2011 19:14 #
а как браузер попадет на нужный ip ?
m0Ray 10.01.2011 19:32 #
А что, DNS уже отменили?
Slimy 10.01.2011 20:02 #
Я имел виду для разработки. Поднимать для этого DNS сервер который всеравно надо настраивать в чем тогда +?
m0Ray 10.01.2011 20:17 #
В любом случае новый хост надо создавать, и неважно, в hosts его вписывать или в конфиг DNS-сервера. Сейчас настолько стало просто настраивать DNS, что hosts, в общем-то, нафиг никому уже не нужен. Вон под openSuSE есть YaST - настраивает всё, хочешь с графики, хочешь через браузер, хочешь с консоли.
Есть и бесплатные DNS-службы, кстати - тот же DynDNS.

С такой настройкой HTTP-сервер сам подхватит любой хост, который будет на него показывать - только каталог под него создай. В стандартной поставке мало в каком дистрибутиве идёт такая настройка. С тем и писана сия статейка.

Если тебе вообще хочется одним тыком мышки сразу всё заводить - есть готовые решения, в том числе провайдерские. Parallels вон вроде неплохие штуки делает.

Опять же в openSuSE YaST умеет заводить виртуалхосты ручками. Но - явно, с персональной настройкой каждого хоста.

Здесь же - всё автоматом, по HTTP-заголовку Host.
Slimy 10.01.2011 21:43 #
Да я не про хостинг вовсе.
m0Ray 10.01.2011 21:47 #
А про что же?
xT 10.01.2011 21:49 #
про рабочую станцию разработчика веб-приложений\сайтов\etc
m0Ray 10.01.2011 21:56 #
От большого хостинга оно отличается только масштабами. Принципиально это всё тот же LAMP/LLMP/LNMP/нужное_вставить.
А хост так или иначе придётся где-то создавать.

Вот я и не понимаю, а в чём проблема-то? Что не нравится в куче существующих решений, в том числе мышевозильных типа YaST?
xT 10.01.2011 22:03 #
такси от авиакомпании тоже только масштабами отличается

а так я то с тобой согласен : )
xT 10.01.2011 21:48 #
ну и в чем проблема?
создать зону .dev и всё с нее отправлять на локалхост
с этим запросто справится легенький dnsmasq
Slimy 10.01.2011 22:09 #
Ну вот напишите по подробнее. А через hosts никак нельзя? чтобы все адресса кончающиеся на .loc или .dev отсылали на localhost? И еще такой вопрос переменные в конфиге поддерживаются? Например для путей было бы очень удобно и меньше вероятность ошибится особенно в случае перемещения каталогов. Что бы быть верно понятым пример вместо
VirtualDocumentRoot /srv/www/vhosts/%0/htdocs
VirtualScriptAlias /srv/www/vhosts/%0/cgi-bin
чтото вроде
$root_dir=/srv/www/vhosts/
VirtualDocumentRoot $root_dir%0/htdocs
VirtualScriptAlias $root_dir/%0/cgi-bin
как то так можно?