Автоматические хосты для веб-разработки (FreeBSD)



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

Как вариант, можно скриптами обновлять конфиги apache и файл hosts.

Другое решение, настройка собственного DNS сервера с зоной верхнего уровня.
Это мы и сейчас и проделаем.

Итак, создадим зону ".dev" (используя демон named и apache под FreeBSD)

Правим файл /etc/namedb/named.conf:
options {
   directory	"/etc/namedb";
   pid-file	"/var/run/named/pid";
   dump-file	"/var/dump/named_dump.db";
   statistics-file	"/var/stats/named.stats";

   // внешний DNS
   // укажите ваш текущий DNS
   // или сервер компании <s>зла</s> добра:
   forwarders { 8.8.8.8; };
};

// наша зона
zone "dev" { type master; file "master/dev"; };


Создаем файл новой зоны /var/named/etc/namedb/master/dev:
$TTL 3600        ; 1 hour
dev.             IN      SOA    ns1.dev. admin.www.dev (
                                2009112601      ; Serial
                                10800           ; Refresh
                                3600            ; Retry
                                604800          ; Expire
                                86400           ; Minimum TTL
                         )


; DNS Servers
                 IN      NS      ns1.dev


                 IN      A       127.0.0.1

; Machine Names
ns1              IN      A       127.0.0.1
*                IN      A       127.0.0.1


После перезапуска namedb и указав 127.0.0.1 в качестве вашего DNS (/etc/resolv.conf), любой-адрес.dev будет вести на 127.0.0.1.
Пробуем?
% dig любой-адрес.dev
…
;; ANSWER SECTION:
\208\187\209\142\208\177\208\190\208\185-\208\176\208\180\209\128\208\181\209\129.dev. 3600 IN A 127.0.0.1
…

% ping waka.dev                                                             ~
PING waka.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.024 ms
^C


Теперь нужно научить apache. В httpd.conf пишим в конец файла:
UseCanonicalName Off
VirtualDocumentRoot /www/%-1/%-2


После перезапуска apache, набираем в адресе браузера http://habrahabr.dev/ — apache выдаст /www/dev/habrahabr/index.html
Заранее создаем этот файл (иначе полуим ошибку 404) и разрешаем доступ на /www/dev/ (иначе получим ошибку 403) в httpd.conf:
<Directory "/www/dev/">
      Options Indexes Includes FollowSymLinks
      AllowOverride All
      Allow from all
</Directory>


Другие компьютеры


Дополнительно, можно сделать доступной эту схему в виртуальных машинах и в локальной сети. Для этого нужно в файле /etc/namedb/master/dev поменять 127.0.0.1 на IP вашего компьютера и указать его в качестве DNS на нужных компьютерах.

Веб студия


В фирме, где вы работаете, можно для каждого сотрудника настроить свой домен 1 или 2 уровня используя один DNS сервер.

Ой!


  1. Apache неправильно передает DOCUMENT_ROOT в cgi или в mod_php.
    Вместо вычисленного VirtualDocumentRoot он передает DocumentRoot указанный в httpd.conf.
    Имейте это ввиду при использовании этой переменной.
  2. Современные браузеры совмещают адресную строку и строку поиска. Если вас перекидывает на результаты поиска после ввода домена, домен вводите со слэшом (/) на конце, напрмер, waka.dev/



Ссылки

Apache: Динамически конфигурируемый массовый виртуальный хостинг
Share post

Similar posts

Comments 21

    +1
    А если вы работаете под OS X с приложением на Rails или любым другим приложением на Rack — вам поможет Pow.
      0
      Не только под макось, в группе ror2ru кто-то писал аналог под Linux, работало.
      +1
      Где можно приобрести такую футболку?
      –6
      А для работающих под Windows — есть Денвер.
        +6
        Для работающих под Windows все тот же bind и все тот же apache.
        А велосипеды оставьте школьникам.
          0
          Не надо опять разводить холивар linux vs windows.
          +3
          >Apache неправильно передает DOCUMENT_ROOT в cgi или в mod_php.
          >Вместо вычисленного VirtualDocumentRoot он передает DocumentRoot указанный в httpd.conf.
          >Имейте это ввиду при использовании этой переменной.

          в php.ini пишем
          auto_prepend_file = /var/www/vhosts/virtual.prepend.php

          в самом virtual.prepend.php пишем
          <?php
          $http_host = explode('.',$_SERVER['HTTP_HOST']);
          $__mod_vhost_alias_fix_doc_root = dirname(__FILE__) . DIRECTORY_SEPARATOR . $http_host[0];

          if (is_dir($__mod_vhost_alias_fix_doc_root))
          {
          $_SERVER['__MOD_VHOST_FIX_OLD_DOCUMENT_ROOT'] = $_SERVER['DOCUMENT_ROOT'];
          $_SERVER['DOCUMENT_ROOT'] = $__mod_vhost_alias_fix_doc_root;
          }
          ?>
            0
            давно такое сделал себе, только напрягает каждый раз /etc/resolv.conf править, чтобы прописать nameserver 127.0.0.1
              0
              Используйте resolvconf.
                0
                или хук к dhclient'у (make-resolv-conf).
                0
                зачем каждый раз? можно указать единожды, а в опциях добавить что-нибудь типа:

                options {
                forward only;
                forwarders {
                ip-addresses-of-resolvers;
                };

                а для отдельных зон:
                zone "example.com {
                type master;
                forwarders {};
                file "/path/to/zonefile";
                }


                В результате такой сервер будет обрабатывать все запросы к зоне example.com, а остальное слать каким-нибудь, например провайдерским, резолверам.
                Если же имеется белый ип, то все еще проще — достаточно просто рекурсию не запрещать.
                0
                Под макось есть еще virtualhost-sh.
                  0
                  +1
                  Красивое решение.
                  Для себя я делал подобную автоматизацию. Как писалось в статье, путем скрипта.
                  Решение с DNS ну очень порадовало.
                  Автору спасибо.
                    0
                    Решение красивое, но апач не показывает субдомены, равно как и просто dev/ (иногда бывает полезно). Я описывал немного другой метод, лишённый этих недостатков.
                        +1
                        А если лень возится с bind, то можно поставить dnsmasq и поменять одну строчку.

                        0
                        Для того чтобы не возиться с resolv.conf (для тех кто получает все настройки средствами dhcp) можно:
                        1. в named.conf не указывать forwarders вообще
                        2. в dhcpclient.conf раскоментировать строку prepend domain-name-servers 127.0.0.1;
                          0
                          Мы примерно так и сделали, кстати, тоже «dev». Правда, через какое-то время отказались от собственной зоны, т.к. было удобнее использовать реальную зону, реальный домен — при желании можно открывать доступ извне без всяких проблем. Для каждого внутреннего сервера настроен субдомен, а также проксирование для внешних посетителей.

                          Only users with full accounts can post comments. Log in, please.