m0Ray 23.11.2010 14:45
How-to`s — HTTP-сервер: виртуальные хосты быстро и просто
Преимущества описываемого решения
1) Нет необходимости менять конфигурацию сервера при добавлении и удалении новых хостов.
2) Добавлять/удалять хосты можно "на лету", без перезапуска сервера.
Как это работает
При выполнении HTTP-запроса клиент передаёт серверу заголовок Host, содержащий имя хоста. Сервер ищет подкаталог с таким именем в указанном в конфиге каталоге. Если такой каталог существует, он принимается в качестве корневого. Если нет - в зависимости от настроек показывается хост по умолчанию или возвращается ошибка (например, 404).
Настройка для Apache
У этого индейца для наших целей есть амулет под названием mod_vhost_alias. Его надо навесить на апача. Как это делается, рассказывать не буду, способов множество в зависимости от вашего дистрибутива и версии краснокожего. Главное для нас то, что он добавляет в пространство имён конфигурационных директив две волшебные штучки: VirtualDocumentRoot и VirtualScriptAlias.
Для начала надо запретить апачу редирект на "каноническое имя" ServerName, иначе амулет не сработает.
1 |
|
Простейшим случаем будет, например, такая настройка:
1 |
|
Вместо %0 апач подставит пришедший ему HTTP-заголовок Host и будет искать корневые каталоги в /srv/www/vhosts.
Я обычно делаю так:
1 |
|
Это позволяет для каждого виртуального хоста иметь как обычный корневой каталог, так и отдельный каталог для cgi-скриптов.
Псевдонимы хостов (например, www.domain.tld для domain.tld) легко делать при помощи символических ссылок. Иногда после этого апачу требуется объяснять, что по ссылкам ходить всё-таки можно и это совсем не больно:
1 |
|
Зачастую требуется назначить какие-то опции сразу всем виртуальным хостам. Это можно делать так:
1 |
|
Тут мы разрешили переопределять любые настройки в файлах .htaccess, которые лежат в соответствующих каталогах виртуальных хостов.
Можно, конечно, использовать и более сложную структуру каталогов, чтобы не сваливать все хосты в одну кучу. Разделить по первым буквам, TLD, или вовсе выстроить их в дерево. Однако мне кажется, что если вам это понадобилось, вы наверняка владелец крупной хостинговой площадки и достаточно опытный админ, чтобы прочитать документацию.
Настройка для lighttpd
На моих серверах я обычно применяю именно этот http-сервер, так как он потрясающе лёгок и быстр. Из недостатков у него разве что отсутствие поддержки файлов .htaccess, но у него есть свои средства управления, с другим синтаксисом. С PHP он легко сращивается при помощи FastCGI, таким образом без проблем заменяя популярную связку Apache+nginx. Но мы сейчас не об этом.
У этого сервера есть аж целых три модуля для реализации разного рода виртуального хостинга, но мне лично всегда хватало одного: mod_simple_vhost. Это совсем просто:
1 |
var.vhosts_dir = "/srv/www/vhosts"
|
В этом примере мы загрузили модуль <2>, определили каталог, где нужно искать корневые каталоги хостов <1,3,4>, и хост по умолчанию (<5>, если запрошенного хоста не существует или, не приведи Аллах, заголовок Host не пришёл). Путь к нужному каталогу формируется так: server-root + Host + document-root.
Собственно, и всё с этим модулем. Ну а если понадобится что-то более навороченное - тут я вас опять отошлю к документации.
DEViANCE 23.11.2010 15:12 #
+ 4 -
Для полноты не хватает nginx.
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
Лично мне оно ни к чему :) Я и так знаю, как настроить nginx. Это я писал автору, чтобы добавил в пост, мало ли кому-то пригодится. :)
Так, собственно, при использовании nginx на фиг не нужен lighttpd :)
Сам лично юзаю nginx + php-fpm.
Сам лично юзаю nginx + php-fpm.
Забыл уточнить, что и в том, и в другом случае Апач тем более не нужен :)
Спорное утверждение. Недавно знакомые тесты различные проводили и оказалось что во многих случаях связка nginx+apache2 быстрее чем nginx+php-fpm.
Ну, точных цифр я не помню, но помню что лайти смог обрабатывать только 37 запросов в секунду, против nginx+apache за 100 или даже 200 запросов в секунду. Помню что намного больше.В общем, всё это легко проверяется с помощью ab.
Что настройки? Понятное дело что бывает. В том-то и дело что в апаче mod_php и даже с ним оказалось быстрее.
Ну mod_php вообще быстрее по определению. Одна беда - нормально работает только с prefork MPM, а это - память...
можно ограничить кол-во. prefork процессов примерно до двух(лучше подстроить под свои нужды). Я собственно так и сделал. На моей VDS'ке из 700Мб занято в редких случаях 400Мб, а там крутится далеко не один сайт ;)
Вообще советую на эту тему почитать у juev'а - juev.ru. Он не так давно довольно немало статей написал на тему оптимизации VPS'ки.
Это уже дело вкуса.
Просто у nginx я не увидел эффективных (то есть как минимум простых в развёртывани) способов связки с PHP/Ruby/etc... Мож я и тупой, конечно...
Ну а апач тяжёл, и это у него не отнять.
Просто у nginx я не увидел эффективных (то есть как минимум простых в развёртывани) способов связки с PHP/Ruby/etc... Мож я и тупой, конечно...
Ну а апач тяжёл, и это у него не отнять.
Апач популярен, а nginx, имхо, не очень функционален. Спаривать их иногда полезно для уменьшения использования оперативки сервера, но это всё равно полумеры.
Краснокожего себе можно позволить, если оперативка измеряется десятками гигабайт. В иных случаях, как мне кажется, лайти заменит и nginx, и индейца.
Краснокожего себе можно позволить, если оперативка измеряется десятками гигабайт. В иных случаях, как мне кажется, лайти заменит и nginx, и индейца.
Апач популярен, а nginx, имхо, не очень функционален.
хорошее сравнение : )
а выкинуть апач в chroot не? если не то почему? в случае его компрометации основная система таки не пострадает.
Я рассмотрел настройку только виртуального хостинга. Опишите настройку chroot jail в соответствующем посте, вам все карты в руки.
сразу извиняюсь за, быть может, глупый вопрос, но разве в апаче sites-available/sites-enable не для этого же?
"в каталоге /etc/apache2/sites-available находятся файлы конфигурации хостов, а в /etc/apache2/sites-enabled находятся символические ссылки на файлы конфигурации /etc/apache2/sites-available, включенных хостов."
Я рассматривал конфигурацию апача вообще. То, что вы описываете, это уже какие-то заточки конкретного дистрибутива.
Я сам в openSuSE (которую использую в качеcтве основного инструмента) вижу подобные подходы к конфигурированию. Например, сервер в основном конфиге инклюдит файлы из подкаталога conf.d, а там каждый модуль описан отдельным файлом. Это нормально.
Здравомыслящий админ сделает из этого поста отдельный файлик в conf.d и сделает всё так, чтобы изменения были отключаемы. Ну а для девелоперской песочницы вообще неважно, где в конфиге это будет прописано.
Ну и наконец вот что: у вас там конфиги, которые для их применения требуют перезагрузки сервера. А описанное решение работает динамически во время непрерывной работы сервера.
Я сам в openSuSE (которую использую в качеcтве основного инструмента) вижу подобные подходы к конфигурированию. Например, сервер в основном конфиге инклюдит файлы из подкаталога conf.d, а там каждый модуль описан отдельным файлом. Это нормально.
Здравомыслящий админ сделает из этого поста отдельный файлик в conf.d и сделает всё так, чтобы изменения были отключаемы. Ну а для девелоперской песочницы вообще неважно, где в конфиге это будет прописано.
Ну и наконец вот что: у вас там конфиги, которые для их применения требуют перезагрузки сервера. А описанное решение работает динамически во время непрерывной работы сервера.
Вопрос такой как сделать хосты чтобы создавались при создании нового проекта? Т.е. ваш путь всеравно предполагает ползать в hosts как минимум. Это в общем даже не проблема конкретно сервера, но некоторые фреймфорки рнр не хотят нормально работать пока их в хост не запиахаешь, это так по мудацки неудобно для разработки что просто удивительно что нет решения нормального.
Я имел виду для разработки. Поднимать для этого DNS сервер который всеравно надо настраивать в чем тогда +?
В любом случае новый хост надо создавать, и неважно, в hosts его вписывать или в конфиг DNS-сервера. Сейчас настолько стало просто настраивать DNS, что hosts, в общем-то, нафиг никому уже не нужен. Вон под openSuSE есть YaST - настраивает всё, хочешь с графики, хочешь через браузер, хочешь с консоли.
Есть и бесплатные DNS-службы, кстати - тот же DynDNS.
С такой настройкой HTTP-сервер сам подхватит любой хост, который будет на него показывать - только каталог под него создай. В стандартной поставке мало в каком дистрибутиве идёт такая настройка. С тем и писана сия статейка.
Если тебе вообще хочется одним тыком мышки сразу всё заводить - есть готовые решения, в том числе провайдерские. Parallels вон вроде неплохие штуки делает.
Опять же в openSuSE YaST умеет заводить виртуалхосты ручками. Но - явно, с персональной настройкой каждого хоста.
Здесь же - всё автоматом, по HTTP-заголовку Host.
Есть и бесплатные DNS-службы, кстати - тот же DynDNS.
С такой настройкой HTTP-сервер сам подхватит любой хост, который будет на него показывать - только каталог под него создай. В стандартной поставке мало в каком дистрибутиве идёт такая настройка. С тем и писана сия статейка.
Если тебе вообще хочется одним тыком мышки сразу всё заводить - есть готовые решения, в том числе провайдерские. Parallels вон вроде неплохие штуки делает.
Опять же в openSuSE YaST умеет заводить виртуалхосты ручками. Но - явно, с персональной настройкой каждого хоста.
Здесь же - всё автоматом, по HTTP-заголовку Host.
От большого хостинга оно отличается только масштабами. Принципиально это всё тот же LAMP/LLMP/LNMP/нужное_вставить.
А хост так или иначе придётся где-то создавать.
Вот я и не понимаю, а в чём проблема-то? Что не нравится в куче существующих решений, в том числе мышевозильных типа YaST?
А хост так или иначе придётся где-то создавать.
Вот я и не понимаю, а в чём проблема-то? Что не нравится в куче существующих решений, в том числе мышевозильных типа YaST?
такси от авиакомпании тоже только масштабами отличается
а так я то с тобой согласен : )
а так я то с тобой согласен : )
ну и в чем проблема?
создать зону .dev и всё с нее отправлять на локалхост
с этим запросто справится легенький dnsmasq
создать зону .dev и всё с нее отправлять на локалхост
с этим запросто справится легенький dnsmasq
Ну вот напишите по подробнее. А через 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
как то так можно?
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
как то так можно?