Переход к предыдущей публикации Отпуск не накрылся - всего лишь откладывается. Настройка репликации MySQL Переход к следущей публикации

Хитрый Апач или алфавит на первом месте

Вторник, 16 сентября, 2008 16:20:11 EEST

Исправления от 23 марта, 2009 13:54:31

Хитрый Апач :) Встретился сегодня с довольно интересной особенностью веб-сервера 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. :lol:

Руки потянулись к консоли, посмотреть в логи, но и без логов я уже догадывался что произошло. Мой Апач после появления нового виртуалхоста, в котором прописан 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
  • компания Стройкомплект является ведущим поставщиком строительных материалов (кирпич, металлочерепица, кровля, профнастил, ЖБИ) в Москве и Московской области

Похожие публикации

Выделенные сервера дешевле обычного хостинга

Комментариев 7

Daemony 15 июня, 2009 21:52:21 EEST .:. ID #12368 .:.

maxcdklub: нужно ли на нем поднимать например bind

Зачем?

Бинд не имеет отношения к тому, что Апаче читает файлы виртуалхостов в алфавитном порядке. Бинд сам по себе, а Апач сам по себе.

maxcdklub: apache2 : could not reliably determine the server’s fully qualified domain name, using 1.1.1.1..

Если я правильно понял, что за ошибка возникает у тебя, то это значит, что твой Апач не может в DNS отыскать свое имя :) Или переключи HostnameLookups в Off или в /etc/hosts на своем VPS пропиши собственное имя, привязав к собственному IP. Например:

    111.111.111.111       site.org

Или сделай так, чтобы в глобальной системе DNS твой site.org резолвился как следует.

Последнее - самое правильное решение. Второе - подходит для тестовых целей, когда сайт уже построили, а имя еще не зарегали.

maxcdklub 15 июня, 2009 14:52:40 EEST .:. ID #12354 .:.

Почитал…возник ряд вопросов…если мы имеем vps у хостера…апач +пхп+мускул-это понятно…нужно ли на нем поднимать например bind, или же можно попросить все что надо прописать хостера?
2) apache2 : could not reliably determine the server’s fully qualified domain name, using 1.1.1.1.. версия 2.2.3 что бы это могло быть…краткая диспозиция :neutral: в папке site-available кроме default создаю например site.org (это не локалхост)
NameVirtualHost site.org:80

ServerName site.org
ServerAlias -=-ссылка-=-
ServerAdmin qwe@qwe.qwe
DocumentRoot /var/www/site.org

……итд

Daemony 12 мая, 2009 08:57:13 EEST .:. ID #9863 .:.

 

Ad1ce: Вопрос по апачу. У меня на серваке со временем айдишники процессов апача увеличиваются. Глупый вопрос это нормально? И когда доходит до порядка 50000. Забивается вся память. В логах это: [error] child process 58693 still did not exit, sending a SIGKILL

ненормально.

Что в конфиге? Timeout, KeepAlive, MaxKeepAliveRequests, KeepAliveTimeout, StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequestsPerChild? Версия Апача?

Ad1ce 12 мая, 2009 02:45:57 EEST .:. ID #9841 .:.

Вопрос по апачу.
У меня на серваке со временем айдишники процессов апача увеличиваются. Глупый вопрос это нормально?
И когда доходит до порядка 50000. Забивается вся память. В логах это:
[error] child process 58693 still did not exit, sending a SIGKILL
и третий вопрос. В процессах у меня он так висит:
/usr/local/sbin/httpd -DNOHTTPACCEPT
Что означает приставка, нормально ли это. Вроде бы все работает, но DNOHTTPACCEPT смущает.

Руслан 25 сентября, 2008 11:13:21 EEST .:. ID #859 .:.

Для интереса заглянул(:)Что ж - неплохо весьма:)

Daemony 17 сентября, 2008 07:15:47 EEST .:. ID #849 .:.

NetSpider, попробуй тоже самое на втором Апаче. Он тоже понимает Include.

получается апач в этом случае “применит” первое попавшееся правило (виртхост)? Т.е., если первым попадется виртхост с алиасом *-й, то на остальные он не глянет?

Думаю надо брать конкретную панель и экспериментировать. У меня нет ни одной пока. Да и мой случай несколько нестандартный - я решил потестить Wordpress MU… ;) Возможно, по этим причинам многие хостеры отказывают в услугах поддержки многопользовательского WP (с поддоменами).

но уже давно ведь есть 1.5.1 и даже 7 версии PCBSD

Да все руки не доходят…

Пока не обновляешься?

Надо отключить в админке эту паливную функцию. :lol:

NetSpider 17 сентября, 2008 06:35:52 EEST .:. ID #846 .:.

Привет

Интересная заметка. Как-то не обращал внимания на данную особенность.
Некоторые панели хранят настройки в файлах имя_юзера_апач.конф, некоторые просто в одном файле вхостс.конф - получается апач в этом случае “применит” первое попавшееся правило (виртхост)? Т.е., если первым попадется виртхост с алиасом *-й, то на остальные он не глянет? Ужость =)
Интересно то же проверить на 2.2-м апаче..

P.S.
В меню “скачать” есть ссылка “PC-BSD 1.4 RELEASE ISO”, но уже давно ведь есть 1.5.1 и даже 7 версии PCBSD.

P.P.S.
Доступна новая версия WordPress (2.6.2)! Пожалуйста, сообщите администратору сайта.
Пока не обновляешься?

Возник вопрос по этой теме, или есть что добавить? Говорите!

  1. Зарегистрированным пользователям вводить защитный код (captcha) не приходится.
  2. Загрузить свою аватарку Вы сможете, зарегистрировавшись на сервисе www.gravatar.com
Публикуя комментарий Вы подтверждаете, что ознакомились c Правилами и принимаете их!
HOMOSAPIENS ONLY! :)