Хитрый Апач или алфавит на первом месте
Встретился сегодня с довольно интересной особенностью веб-сервера Apache (ветка 1.3), которую раньше не встречал никогда. И пусть, возможно, она “стара как мир” хотел бы о ней рассказать. Может кому-то в будущем пригодится.
Началось с того, что я решил слегка разобрать и привести в более удобоваримый вид файл конфигурации httpd.conf на этом сервере. Ранее все виртуальные хосты были описаны непосредственно в нем, но со временем их стало многовато и перемещаться по конфигу стало не очень удобно. Я решил избавиться от этого, путем выноса конфигураций виртуалхостов в отдельные (для каждого хоста) текстовые файлы, а в httpd.conf воспользоваться директивой Include для подключения скопом всех VirtualHost. Кстати, кто еще не знает такого приема - возьмите на заметку. Очень удобно добавлять/редактировать/удалять виртуальные хосты поскольку при этом нет необходимости лазить в httpd.conf Собственно, как это выглядит на деле, покажу на примере ниже.
Изначально httpd.conf выглядел традиционно вот так:
########## Виртуальные хосты ############ NameVirtualHost *:80 <VirtualHost> ServerName localhost AddType application/x-httpd-php .php .php3 .php4 .phtml AddType application/x-httpd-php-source .phps </VirtualHost> <VirtualHost> ServerName server.com ServerAdmin bla_-_bla_-_bla@server.com DocumentRoot /path/to/htdocs ... CustomLog /path/to/custom/log.log combined ErrorLog /path/to/error/log.log ServerName site1.server.com ...
И так далее перечисляются все остальные виртуальные хосты. Уходя от такого метода, поступаем так:
- Создаем папку для хранения файлов конфигурации виртуальных хостов (у меня это будет папка vhosts в папке конфигов Apache /usr/local/etc/apache).
- Создаем в этой папке файлы конфигурации виртуальных хостов, которые поддерживает наш веб-сервер. Имена этих файлов не имеют значения, но для удобства я решил назвать их по именам виртуальных хостов, чтобы было потом проще разбираться с ними, когда их станет очень много. У меня получилось примерно так:
# ls -la /usr/local/etc/apache/vhosts/ total 30 drwxrwx--- 2 www www 512 16 сен 11:54 . drwxrwx--- 8 www www 512 16 сен 10:37 .. -rw-r----- 1 www www 170 16 сен 10:35 localhost.conf -rw-r----- 1 www www 812 16 сен 11:54 server.com.conf -rw-r----- 1 www www 1938 16 сен 11:40 site1.server.com.conf -rw-r----- 1 www www 822 16 сен 10:20 site2.server.com.conf -rw-r----- 1 www www 1345 16 сен 10:18 site3.server.com.conf -rw-r----- 1 www www 682 16 сен 10:21 site4.server.com.conf -rw-r----- 1 www www 1079 16 сен 10:17 site5.server.com.conf -rw-r----- 1 www www 2065 16 сен 10:34 site6.server.com.conf -rw-r----- 1 www www 754 16 сен 10:16 site7.server.com.conf
В каждый файл прописывается конфигурация отдельного виртуального веб-сервера, начиная от <VirtualHost> и заканчивая </VirtualHost> Ничего больше. Выставляем на эти файлы соответствующие права доступа.
- Правим httpd.conf, избавляясь в нем от записей о виртуальных хостах, заменяя их на инклуд:
########## Виртуальные хосты ############ NameVirtualHost *:80 Include etc/apache/vhosts/*.conf
При условии что директива ServerRoot установлена в “/usr/local”
- Сохраняем httpd.conf и проверяем конфигурацию сервера командой apachectl configtest за которой обычно следует:
# apachectl configtest Processing config directory: /usr/local/etc/apache/vhosts/*.conf Processing config file: /usr/local/etc/apache/vhosts/localhost.conf Processing config file: /usr/local/etc/apache/vhosts/server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site1.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site2.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site3.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site4.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site5.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site6.server.com.conf Processing config file: /usr/local/etc/apache/vhosts/site7.server.com.conf Syntax OK
Если появилось Syntax OK значит все сделано правильно. Можно сказать apachectl restart чтобы изменения вступили в силу.
А вот теперь о хитростях. Возникла необходимость научить веб-сервер отвечать на все запросы, которые к нему прийдут, к субдоменам определенной доменной зоны. Другими словами, нужно чтобы запрос клиентского браузера вида “что_угодно.daemony.org” был адресован именно тому виртуалхосту, которому нужно.
Чтобы такие запросы вообще попадали к моему веб-серверу, в DNS для зоны daemony.org следует добавить запись вида
* IN A
указывающую на IP адрес моего сервера. Такую запись называют wildcard - “звездочка”, которая подразумевает все, что угодно. “Звездочка” в DNS никак не влияет на остальные (A, CNAME и прочие) записи для данной зоны. Тоесть, при наличии в зоне daemony.org субдоменов live, forum и т.д. в первую очередь сервер имен выдаст информацию об этих явно указанных субдоменах, а если пришел запрос на поиск имени, которого явно не описано в конфигурации зоны, будет выдана информация согласно wildcard.
Итак, есть уже на сервере рабочий домен и виртуалхост с известным Вам именем live.daemony.org. Требуется другим виртуалхостом обрабатывать запросы ”что_угодно.daemony.org“. Для этого в папку с конфигами зон /usr/local/etc/apache/vhosts я положил еще один файлик и назвал его daemony.org.conf. Начинается он так:
ServerName daemony.org
ServerAlias *.daemony.org
ServerAdmin root[+]daemony.org
DocumentRoot /path/to/htdocs
...
И так далее.
В /path/to/htdocs при этом пока нет никаких файлов и листинг корневого каталога сайта запрещен.
Сохранил файл. Перезапустил Апаче… А через 2 минуты получил ругань от сервиса мониторинга на ошибку HTTP 403 при доступе к Daemony’s Live Blog. Открыл сам, чтобы убедиться и увидел как и ожидалось Forbidden.
Руки потянулись к консоли, посмотреть в логи, но и без логов я уже догадывался что произошло. Мой Апач после появления нового виртуалхоста, в котором прописан ServerAlias *.daemony.org перестал реагировать на директивы в файле конфигурации виртуалхоста live.daemony.org.conf и, соответственно, начал обрабатывать все запросы вида *.daemony.org, не принимая во внимание наличие явного указания другого виртуального сервера.
Незадача…
И че делать?
Для начала закоментил я эту новую зону, перезапустил Апаче - вернул все как было, чтобы посетители на сайте не подумали ничего плохого. Еще раз посмотрел на листинг
# ls -la /usr/local/etc/apache/vhosts/ ... -rw-rw---- 1 www www 812 16 сен 11:54 daemony.org.conf -rw-rw---- 1 www www 824 16 сен 10:21 xxxxx.xxxxxx.xxx.conf -rw-rw---- 1 www www 170 16 сен 10:35 localhost.conf -rw-rw---- 1 www www 1938 16 сен 11:40 live.daemony.org.conf -rw-rw---- 1 www www 822 16 сен 10:20 forum.daemony.org.conf -rw-rw---- 1 www www 1345 16 сен 10:18 xxx.xxxxx.xxx.conf -rw-rw---- 1 www www 682 16 сен 10:21 xxxxxxxxxxxxx.xxx.conf -rw-rw---- 1 www www 1079 16 сен 10:17 xxxx.xxxxxxx.xxx.conf -rw-rw---- 1 www www 2065 16 сен 10:34 xx.xxxxxxx.xxx.conf -rw-rw---- 1 www www 754 16 сен 10:16 xxx.xxxxxxx.xxx.conf
Никакого криминала. “Что здесь может быть не так? Почему bind среди своих конфигов понимает, что сначала нужно обработать явные запросы, а apaсhe нет? Каким принципом он вообще руководствуется? Прийдется залазить в доку на apache.org и вникать… Где-то же должно быть это написано.” С этими мыслями я сделал себе кофе и пошел курить.
Прохладный осенний воздух привнес просветление.
А что если Apache читает конфигурационные файлы виртуальных хостов по именам файлов в алфавитном порядке и, соответственно, в том же порядке воспринимает директивы в них. Догадка оказалась верной. Посмотрим еще раз на предыдущий листинг. Действительно, файлы в нем стоят в алфавитном порядке. Так по-умолчанию их сортирует команда ls. Но ведь ничего не мешает переименовать эти файлы как нам заблагорассудится c целью выстроить их по алфавиту так как нужно. Простой вариант, какой получился у меня:
# ls -la /usr/local/etc/apache/vhosts/ ... -rw-rw---- 1 www www 170 16 сен 10:35 001_localhost.conf -rw-rw---- 1 www www 1938 16 сен 11:40 002_live.daemony.org.conf -rw-rw---- 1 www www 822 16 сен 10:20 003_forum.daemony.org.conf -rw-rw---- 1 www www 824 16 сен 10:21 004_xxxxx.xxxxxx.xxx.conf -rw-rw---- 1 www www 1345 16 сен 10:18 005_xxx.xxxxx.xxx.conf ... -rw-rw---- 1 www www 812 16 сен 11:54 XXX_daemony.org.conf
И все. Вновь возвращаем все нужные настройки в XXX_daemony.org.conf - все как требовалось работает.
Теперь Apache сначала воспринимает настройки в 002_live.daemony.org.conf и в 003_forum.daemony.org.conf и напоследок в XXX_daemony.org.conf
P.S.: Уверен, что баян, но не менее уверен, что я не последний кто встретился с этой особенностью Apache. Если кому-то пригодится, порадуюсь за Вас.
- современный терминал сбора данных позволяет оперативно управлять товародвижением на складах или в магазине на основе штрихкодов. Терминалы, собирая информацию о товаре, передают ее в централизованную базу данных по инфракрасному порту, по wi-fi, либо по проводу. Приобрести терминалы сбора данных в Москве можно в магазине store.ru
- компания Стройкомплект является ведущим поставщиком строительных материалов (кирпич, металлочерепица, кровля, профнастил, ЖБИ) в Москве и Московской области
Похожие публикации
Теги: apache, apachectl, dns, FreeBSD, unix, virtualhost, web сервер, wildcard, www, настройка, сервер


Зачем?
Бинд не имеет отношения к тому, что Апаче читает файлы виртуалхостов в алфавитном порядке. Бинд сам по себе, а Апач сам по себе.
Если я правильно понял, что за ошибка возникает у тебя, то это значит, что твой Апач не может в DNS отыскать свое имя
Или переключи HostnameLookups в Off или в /etc/hosts на своем VPS пропиши собственное имя, привязав к собственному IP. Например:
Или сделай так, чтобы в глобальной системе DNS твой site.org резолвился как следует.
Последнее - самое правильное решение. Второе - подходит для тестовых целей, когда сайт уже построили, а имя еще не зарегали.
Почитал…возник ряд вопросов…если мы имеем vps у хостера…апач +пхп+мускул-это понятно…нужно ли на нем поднимать например bind, или же можно попросить все что надо прописать хостера?
в папке site-available кроме default создаю например site.org (это не локалхост)
2) apache2 : could not reliably determine the server’s fully qualified domain name, using 1.1.1.1.. версия 2.2.3 что бы это могло быть…краткая диспозиция
NameVirtualHost site.org:80
ServerName site.org
ServerAlias
ServerAdmin qwe@qwe.qwe
DocumentRoot /var/www/site.org
……итд
ненормально.
Что в конфиге? Timeout, KeepAlive, MaxKeepAliveRequests, KeepAliveTimeout, StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequestsPerChild? Версия Апача?
Вопрос по апачу.
У меня на серваке со временем айдишники процессов апача увеличиваются. Глупый вопрос это нормально?
И когда доходит до порядка 50000. Забивается вся память. В логах это:
[error] child process 58693 still did not exit, sending a SIGKILL
и третий вопрос. В процессах у меня он так висит:
/usr/local/sbin/httpd -DNOHTTPACCEPT
Что означает приставка, нормально ли это. Вроде бы все работает, но DNOHTTPACCEPT смущает.
Для интереса заглянул(:)Что ж - неплохо весьма:)
NetSpider, попробуй тоже самое на втором Апаче. Он тоже понимает Include.
Думаю надо брать конкретную панель и экспериментировать. У меня нет ни одной пока. Да и мой случай несколько нестандартный - я решил потестить Wordpress MU…
Возможно, по этим причинам многие хостеры отказывают в услугах поддержки многопользовательского WP (с поддоменами).
Да все руки не доходят…
Надо отключить в админке эту паливную функцию.
Привет
Интересная заметка. Как-то не обращал внимания на данную особенность.
Некоторые панели хранят настройки в файлах имя_юзера_апач.конф, некоторые просто в одном файле вхостс.конф - получается апач в этом случае “применит” первое попавшееся правило (виртхост)? Т.е., если первым попадется виртхост с алиасом *-й, то на остальные он не глянет? Ужость =)
Интересно то же проверить на 2.2-м апаче..
P.S.
В меню “скачать” есть ссылка “PC-BSD 1.4 RELEASE ISO”, но уже давно ведь есть 1.5.1 и даже 7 версии PCBSD.
P.P.S.
Доступна новая версия WordPress (2.6.2)! Пожалуйста, сообщите администратору сайта.
Пока не обновляешься?