Настройка общих поддоменов (wildcard subdomains) в Apache

Настройка общих поддоменов за 5 минут

За последнюю неделю мне уже несколько раз приходилось рассказывать, как настраивать общие поддомены (известные как wildcard subdomains) в и /MaraDNS, поэтому решил написать статью, к которой можно будет отсылать интересующихся :-)

Общие поддомены используются в силу множества причин: создание многопользовательских инсталляций блогов/форумов, где каждый пользователь получает домен вида username.domain.tld (в качестве примера можно привести известный WordPress µ), использование одной CMS для управления всеми поддоменами и т.п.

Для серверов на базе Apache процесс настройки общих поддоменов проходит в два этапа.

  1. Создание wildcard-записи DNS

    Первый шаг состоит в создании wildcard-записи DNS. Для разных DNS-серверов это будет осуществляться по-разному (в смысле, принцип один и тот же, различия лишь в синтаксисе конфигурационного файла). Рассмотрим на примере BIND (так как BIND работает и под Linux/UNIX, и под Windows).

    Создание wildcard-записи очень просто: всё, что нужно — это добавить A-запись, связывающую имя вида *.domain.tld с IP-aдресом сервера.

    Рассмотрим на примере одного development-сервера:

    $TTL        86400
    $ORIGIN internetnetworkmarketer.org.ua.
    @  1D  IN         SOA ns1.internetnetworkmarketer.org.ua.        sjinks.internetnetworkmarketer.org.ua. (
                                  2008030500 ; serial
                                  24H ; refresh
                                  15 ; retry
                                  90w ; expire
                                  15 ; minimum
                                 )
                            IN  NS     ns1
                            IN  NS     ns.secondary.net.ua.
                            IN  NS     ns2.trifle.net.
                            IN  MX  10 @
                            IN  A      195.10.218.132
                            IN  TXT    "v=spf1 a mx:internetnetworkmarketer.org.ua -all"
                            IN  SPF    "v=spf1 a mx:internetnetworkmarketer.org.ua -all"
    ns1                     IN  A      195.10.218.132
    www                     IN  A      195.10.218.132
    

    Мы видим, что домен internetnetworkmarketer.org.ua "живёт" по адресу 195.10.218.132; там же находятся два его поддомена — ns1.internetnetworkmarketer.org.ua и www.internetnetworkmarketer.org.ua (технически www.somesite.tld является поддоменом somesite.tld; в общем случае www.somesite.tld и somesite.tld могут быть совершенно разными сайтами).

    На сайт был поставлен WordPress µ, вследствие чего нужно было создать  — чтобы каждый пользователь получал блог вида username.internetnetworkmarketer.org.ua.

    Добавление общего поддомена сводится к добавлению A-записи в конец файла зоны:

    *.internetnetworkmarketer.org.ua.	IN  A      195.10.218.132
    

    После чего нужно было перезапустить BIND.

    После перезапуска придётся подождать некоторое время, пока новые настройки DNS "распространятся" через Internet (этот феномен называется DNS propagation).
  2. Настройка виртуального хоста Apache

    После того, как мы успешно настроили DNS, нужно указать Apache, что он должен обрабатывать адреса вида *.domain.tld (*.internetnetworkmarketer.org.ua в нашем случае).

    Пусть в файле конфигурации у нас есть такая запись о виртуальном хосте:

    [-]
    View Code Apache configuration
    <VirtualHost *:80>
        DocumentRoot "/home/internetnetworkmarketer.org.ua"
        ServerName "internetnetworkmarketer.org.ua"
        ServerAlias "internetnetworkmarketer.org.ua" "www.internetnetworkmarketer.org.ua"
        ErrorLog logs/internetnetworkmarketer.org.ua-error.log
        CustomLog logs/internetnetworkmarketer.org.ua-access.log common
    </VirtualHost>

    Всё, что нам надо — это добавить еще один псевдоним (alias) в директиву ServerAlias:

    [-]
    View Code Apache configuration
    ServerAlias "internetnetworkmarketer.org.ua" "www.internetnetworkmarketer.org.ua" "*.internetnetworkmarketer.org.ua"
    После внесения изменений Apache нужно перезапустить.

Вот так вот всё просто!

Автор: ; опубликовано в: Администрирование; метки: Apache, BIND, общий поддомен
20
Апр
2008

RSS Комментарии к статье «Настройка общих поддоменов (wildcard subdomains) в Apache» (38)  »

  1. Станислав

    Привет, спасибо за статью :) Весьма полезно.

    Есть вопрос по теме: Нужно сделдать для пользователя возможность прикрепить свой домен. Какими средствами этого можно достичь?

    • Станислав, всё зависит от используемого софта.

      Например, если web-приложение поддерживает общие поддомены (как, например, WordPress), то нужно только сконфигурировать DNS и web-сервер: в DNS добавить запись общего поддомена (* IN A ip.ad.dr.es), web-серверу задать псевдоним виртуального хоста (для Apache — ServerAlias *.mysite.com, для nginx — server .mysite.com).

      Если же нет, то нужно смотреть, что вообще можно сделать.

  2. А скажи плз – куда именно добавлять А-запись? В какой файл настроек БИНДа?

    • В файл зоны.

      *.sitename.com IN A ip.ad.re.ss

      • >В файл зоны.
        Сорри, но как бэ именно это и спрашиваю :)
        В каталоге /etc/bind находится 13 файлов.
        В какой из них? Как определить?

        Вот у меня задача для того же вордпресса на локалхосте под линухом (точнее на виртуалхосте). Т.е. для 127,0,0,1.
        Куда я должен прописать А-запись?

        • В каталоге /etc/bind находится 13 файлов.
          В какой из них? Как определить?

          Допустим, сайт называется example.com.
          В этом случае Вам нужно найти строку zone "example.com" в Ваших файлах. В том, в котором она будет найдена, будет содержать код наподобие такого:

          [-]
          View Code Text
          zone "example.com" {
              type master;
              file "/path/to/zone/file";
          };

          /path/to/zone/file и будет требуемым файлом.

          Вот у меня задача для того же вордпресса на локалхосте под линухом (точнее на виртуалхосте). Т.е. для 127,0,0,1.
          Куда я должен прописать А-запись?

          Если все локально, то можно в /etc/hosts — только каждый сайт придётся прописывать отдельно.

          Например,

          [-]
          View Code Text
          127.0.0.1 example.com test.example.com subdomain.example.com
      • Serg

        Vladimir, благодарю за попытку помочь, но видимо мы друг-друга не понимаем :)
        У меня есть настроенные и рабочие виртуалхотсты. (sitelocal1.loc, sitelocal1.loc и тд..).
        Все они прописаны в хостс (Чтобы понятней было – делалось по этой методе: forum.ubuntu.ru/index.php?topic=52552.0 См там спойлер: «Как настроить виртуальные хосты?»).

        Теперь на одном из этих виртулхостов нужно поднять вилкард (записи в хостс – не вариант в данном случае). Для этого собсно и пришлось установить БИНД.
        В его конфигах НЕТ ни одного вируталхоста (что, думаю, естественно).
        Вот я и никак не пойму, куда нужно добавить А-запись.
        В конфиг апача сервералиас вписал и он работает (отвечает, если в хостс ручную прописать сабдомен). Осталось (как я понимаю) настроить БИНД.

        Благодарю за помощь.

        • В /etc/bind/named.conf.local дописываете такое (предполагаю, что у Вас Ubuntu):

          [-]
          View Code Text
          zone "sitelocal1.loc" {
              type master;
              file "/etc/bind/zone-sitelocal1.loc";
          };

          Создаёте /etc/bind/zone-sitelocal1.loc:

          [-]
          View Code Text
          $ORIGIN .
          $TTL 600
          sitelocal1.loc IN SOA localhost.localdomain. root.localhost.localdomain. (20110809094700 600 300 54432000 600)
                         IN NS localhost.localdomain.
                         IN A 127.0.0.1
          *.sitelocal1.loc IN A 127.0.0.1

          Перезапускаете bind, смотрите в логах, что всё в порядке.

          Проверить можно так:

          [-]
          View Code Bash
          dig sitelocal1.loc @127.0.0.1
          dig something.sitelocal1.loc @127.0.0.1

          Затем первой строкой в /etc/resolv.conf дописываете

          [-]
          View Code Text
          nameserver 127.0.0.1

          Если у Вас IP-адреса провайдером раздаются по DHCP, то нужно сказать клиенту, что нужно прописывать новый nameserver в /etc/resolv.conf. У меня это делается так:

          /etc/dhcp/dhclient.conf:

          [-]
          View Code Text
          prepend domain-name-servers 127.0.0.1;

          Как-то так.

      • Serg

        Владимир, огромное спасибо.
        Всё получилось, только БИНД ругался на данные тобой цифры в /etc/bind/zone-sitelocal1.loc.

        Изменив их на значения из /etc/bind/db.local – всё сразу стало ОК.

        Ещё раз благодарю за помощь.

  3. Nadia

    Владимир, добрый день.
    Спасибо за статью. У меня остается открытым только вопрос, как правильно настроить www для субдоменов. Т.е. задача такая:
    основной домен domain.com, http://www.domain.com (все прописано, как вы и описываете, работает)
    субдомен sub.domain.com (прописана A запись вида * A IP – работает), http://www.sub.domain.com – не работает, нет такого домена, почему не работает, в общем, понятно, как заставить – не понятно :)
    Подскажите, как правильно настроить. Заранее благодарна.

  4. Максим

    Владимир,доброе время суток, такой вопрос, может вы знаете.
    Есть сайт test.pro, именно pro. На nic.ru в настройках днс указано *.test.pro.
    Все работает, все отлично. Мы пользуемся адресом aaa.test.pro . Однако, время от время у разных пользователей в разных регионах, в разное время aaa.test.pro перестает открываться. Проверка показала, что домен не пингуется (пишет что такой узел не найден), в тоже время работают любые адреса, которыми никто не пользуется:
    bbb.test.pro, neponeanto_cto_eto.test.pro, www.aaa.test.pro . Причем домен начинает работать примерно минут через 20-30. В чем может быть дело?

  5. Максим

    вчера написал вопрос про домен pro , мой вопрос просто взяли и удалили. почему?

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Настройка общих поддоменов (wildcard subdomains) в Apache»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा