Виртуальные хосты (поддомены) + mod_vhost_alias (VirtualDocumentRoot)

2 ноября 2010
Просмотров: 31104Обсудить
Рубрика: Администрирование -> Web -> Ubuntu -> FreeBSD -> Linux

Запланировал я как-то создать сеть сайтиков небольших вида sub.domain.com.

Как работать с виртуальными хостами я знал и проблем особых с этим нет, если сайтов таки будет, скажем, 10. А если 100 ?? Каждый раз редактировать конфиги апача ??

Начал искать решение (скажу честно - решение нашел быстро, долго не мог настроить корректно). А решение очень простое - использовать модуль к апачу для создания алиасов к виртуальному хосту - mod_vhost_alias и динамической подмены DocumentRoot через VirtualDocumentRoot.

Как включить модуль, думаю сами знаете(ну или загуглите =)), мы же пройдемся по остальным действиям.

1) В панели управления доменом создал поддомен *.domain.com @ , чтоб все поддомены вели на сервер, где находится и основной домен.

2) На сервере сконфигурировал виртуальный хост так:

<virtualhost *:80>
    ServerName www.domain.com
    ServerAlias domain.com *.domain.com
    ServerSignature Off
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^domain\.com [NC]
    RewriteRule ^/(.*) http://www.domain.com/$1 [L,R]
    
    VirtualDocumentRoot /usr/local/www/domain/%0
    ErrorLog /var/log/domain.com/error.log
    CustomLog /var/log/domain.com/access.log combined
    ServerSignature On
    Options FollowSymLinks Includes MultiViews ExecCGI
    UseCanonicalName Off
</virtualhost> 

Ну и некоторый пояснения:

ServerName www.domain.com - указываем основное имя сервера как и обычно настройке виртуальных хостов

ServerAlias domain.com *.domain.com - указываем алиасы для хоста (любой поддомен будет алиасом и будет подчинаться вирт. хосту

RewriteEngine on - включаем реврайн, он нам понадобится

RewriteCond %{HTTP_HOST} ^domain\.com [NC] - задаем условие для реврайта - основной домен без www

RewriteRule ^/(.*) http://www.domain.com/$1 [L,R=301] - редиректим 301-м на домен с www. Эти махинации нужны для того, чтоб корректно отработал VirtualDocumentRoot

UseCanonicalName Off - имя сервера подставляем из заголовков запроса сервера (т.е. то, что ввел юзер - любой поддомен)

VirtualDocumentRoot /usr/local/www/domain/%0 - создаем виртуальный документ рут. Где %0 - папка, с полнім именем домена. Можно использовать %1 - первая часть домена, в таком случае папки для поддоменов надо будет называть как www,sub1,sub2 ...

Дополнительно об этих параметрах можно почитать на сайте httpd.apache.org

Получаем красоту. Чтоб создать поддомен - надо лишь в корне хоста создать папку с его именем.

Если папки нет - 404 ошибка вывалится и все красиво! ;)

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
Метки: , ,


Комментариев: 24
Подписаться на комментарии по RSS
  • #12011-02-17 в 04:14:11Avinet

    Объясните, пожалуйста , что значит "создал поддомен *.domain.com @"

    Что значит здесь значок собачки?


  • #22011-02-17 в 04:23:38Avinet

    @На сервере сконфигурировал виртуальный хост так:@

    А куда вы прописали эти параметры?


  • #32011-02-17 в 12:02:38yaap

    @Avinet

    Если вы зайдете в панель управления доменом, то увидите, что при добавлении поддоменов можно для каждого поддомена указывать отдельный IP адрес, если сайт на другом сервере находится, или же указать "@" - если поддомен находится на том же сервере, что и основной домен.

    @Avinet

    Об настройке LAMP, в том числе и виртуальных хостов, я писал уже:

    http://www.yaap.info/page/ustanovka-i-nastrojka-lamp-linuxapachemysqlphp-v-ubuntu


  • #42011-02-17 в 14:57:17Avinet

    @yaap

    Т.е. порядок действия таков:

    1. Подключить в файле httpd.conf модуль mod_vhost_alias.

    2. Завести имя субдомена * (звездочка) в панели упр. доменом.

    3. В файл httpd.conf скопировать и подредактировать указанный текст.

    4. перезапустить апач?

    Так? )

    Вот нескромный вопрос: а можно ли п.3 скопировать в файл htaccess? )


  • #52011-02-17 в 15:41:12yaap

    @Avinet

    Не совсем =)

    1) В убунте модули включаются так:

    sudo a2enmod mod_vhost_alias

    Ничего в httpd.conf менять не надо.

    2) - все верно

    3) Можно и в httpd.conf, но лучше - в /etc/apache2/sites-available/ добавить файл с названием вашего сайта (аля mysite) в него вставить сожержимое из статьи и набрать

    sudo a2ensite mysite

    И уже потом перегрузить апач.

    На счет вашего вопроса: я не видывал еще, чтоб такое делалось через хтаксес.

    Это должно быть запрещено. Иначе я, заказав мелкий хостинг где-то, насоздавал бы себе доменов левых и был би счастлив =)

    Так что добавляйте виртаульные домены как и все, через конфиги =)


  • #62011-08-29 в 22:42:39BerdArt (анонимно)

    Вот если бы можно было для каждого поддомена автоматически создавать отдельный лог файл - было бы здорово! smile


  • #72011-09-12 в 11:45:40yaap

    @BerdArt (анонимно)

    http://httpd.apache.org/docs/2.0/mod/mod_vhost_alias.html

    The LogFormat directives %V and %A are useful in conjunction with this module.
    %...V The server name according to the UseCanonicalName setting.

    Может это поможет для каждого поддомена свой конфиг сделать (проверить пока нет возможности)


  • #82012-01-24 в 13:15:08Денис (анонимно)

    Здравствуйте! Использую локальный сервер EasyPHP и хочу настроить виртуальные хосты. Панели управления доменами и поддоменами в WAMP`е EasyPHP нет, поэтому не могу понять, как создать поддомен *.domain.com. Подскажите, пожалуйста.

    Спасибо.


  • #92012-01-24 в 13:20:05yaap

    @Денис (анонимно)

    К сожалению, я не работал с EasyPHP, потому ничего не смогу вам дельного ответить. Надо смотреть маны по нема, смотреть где конфиги, как модули подключить и т.д.


  • #102012-01-24 в 14:56:22Денис (анонимно)

    А если не вдаваться в побробности, что это EasyPHP, можете помочь.

    То, что сделал:

    - mod_vhost_alias включил;

    - папку в корне сайта создал;

    - в httpd.conf нашёл раздел VertualHost с примером (вроде с сайта Apache), но не пойму как всё изменить под свои нужды.

    Вот пример из httpd.conf:

    <VirtualHost *:80>
        ServerAdmin webmaster@dummy-host.127.0.0.1
        DocumentRoot "${path}/apache/docs/dummy-host.127.0.0.1"
        ServerName dummy-host.127.0.0.1
        ServerAlias www.dummy-host.127.0.0.1
        ErrorLog "logs/dummy-host.127.0.0.1-error.log"
        CustomLog "logs/dummy-host.127.0.0.1-access.log" common</VirtualHost>
    

  • #112012-01-24 в 16:27:04yaap

    @Денис (анонимно)

    Вы сначала разберитесь как обычные виртуальные хочты настроить. Если я все верно понял, то mod_vhost_alias вам не нужен, т.е. если вам надо лишь создать несколько поддоменов вида sub1.domain.com,sub2.domain.com, то для этого достаточно изучить инструмент для работы с виртуальными хостами.

    В этой статье в разделе по настройке апача описано немного что есть виртуальные домены и что для этого надо сделать.

    Если коротко, то надо

    1) В хостах прописать, что новый поддомен - это локалхост

    2) В апаче указать, в каком месте искать исходники для запрашиваемого домена (настройка в директиве VirtualHost

    3) Перезагрузить апач ;)


  • #122012-01-24 в 16:34:51Денис (анонимно)

    Не знаю каким чудом, но заработало без всяких остальных вмешательств.

    Спасибо за помощь.


  • #132012-01-24 в 16:36:16yaap

    @Денис (анонимно)

    В том то и дело, что чудес не бывает, и пока вы до конца не разберетесь как работают вирт. хосты, так и будете случайно получать то, что нужно, но потом думать, как бы оно не отвалилось ;)


  • #142013-01-29 в 23:09:49Дмитрий (анонимно)

    Ждать обновления DNS нужно или должно заработать сразу?


  • #152013-01-29 в 23:14:20Дмитрий (анонимно)

    Если стоит связка Apache + Nginx, нужно ли какие-то ещё настройки производить?


  • #162013-01-30 в 13:01:11yaap

    @Дмитрий (анонимно)

    Работать дольно сразу, DNS - немного другая парафия.

    @Дмитрий (анонимно)

    Смотря какой функционал вам нужен =)


  • #172013-01-30 в 23:08:21Дмитрий (анонимно)

    На сервере стоит Apache + Nginx, нужно чтобы все поддомены ссылались на основной домен, где я php-скриптом буду отдавать то, что должно быть на поддомене. А-запись создал как надо. В конфиге Apache прописал алиас *.site.com пробовал прописывать алиас в конфиге Nginx, поддомены не работают вообще никак. На сервере стоит панель ISP, если через неё включить поддержку автоподдоменов, то подключается модуль mod_vhost_alias и прописывается строка в конфиге Апача с параметром VirtualDocumentRoot, после этого на сервере ошибка 502 пока не отключишь новый модуль.


  • #182013-01-31 в 12:22:18yaap

    Вот тут смотрели?


  • #192013-04-08 в 16:11:08Аноним (анонимно)

    Здравствуйте, извините что не по теме, но может кто в курсе как настроить. Стоит ubuntu server, на ней apache2, надо чтобы с хост компьютера можно было обратиться к сайту, как это сделать?


  • #202013-04-08 в 16:25:32yaap

    @Аноним (анонимно)

    Если не играться с днс и прочим (т.е. делать быстро и локально - я так делаю для дев. проектов)

    1) На убунту сервере поднимаем вирт хост (любое название - vasya-project)

    2) На локальной машине, с которой будет обращение к хосту - вносим в файлик /etc/hosts

    111.111.111.111 vasya-project

    Сохраняем, теперь при ping vasya-project - будет указанный ИП, и при заходе на vasya-project откроется вирт. хост убунту сервера


  • #212013-04-11 в 16:21:26аноним (анонимно)

    yaap, спасибо большое, помогло!


  • #222013-09-03 в 18:38:53Аноним (анонимно)

    Добрый вечер.

    На моем VPS 2 домена(domain1.ru и domain2.ru).

    Я хочу создать для каждого поддомены.

    С DNS разобрался, а вот с apache нет. У меня пока для них стоит такой пунктик:

    UseCanonicalName Off
    <Directory /var/www>
        Options FollowSymLinks
        AllowOverride All</Directory>
    VirtualDocumentRoot /var/www/%-2
    

    В папке /var/www лежит 2 папки: domain1 и domain2

    Хочется сделать так:

    forum.domain1

    forun.domain2

    domain1

    domain2

    и т.д.

    Конечно можно и с ".ru", но что бы каждый поддомен имел свою папку


  • #232013-09-30 в 11:43:31yaap

    @Аноним (анонимно)

    Мне кажется, что проще будет полный адрес домена использовать

    VirtualDocumentRoot /var/www/%0
    

  • #242014-01-22 в 03:30:13olekhy (анонимно)

    А как же быть с $_SERVER['DOCUMENT_ROOT'] если я использую VirtualDocumentRoot опцию то DOCUMENT_ROOT содержит не верное значение?

    ServerName www.myserver.local

    ## Vhost docroot

    VirtualDocumentRoot /var/opt/develop/%3/htdocs

    в результате получаю:

    echo $_SERVER['DOCUMENT_ROOT'];

    /etc/httpd/htdocs

    что же делать как же быть что бы правильное значение получить?


Оставьте комментарий!

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

(обязательно)