Теория.Mультисайтинг - в моём понимании - обьединение нескольких домен или субдомен в одной-единственной инсталляции.
Заранее скажу, что о такой возможности узнал только после знакомства с друпалом. прояснил больше всего суть темы Mакс на http://www.razgonka.ru/multisiting/. Прояснил больше всех, но не обьяснил. несмотря на это промучился неделю (чистого времени часов 25-30). Справился только воспользовавшись звонком к другу. с его английским нашли хак для кукикосов.
Но попробую всё по порядку и без воды.
Заранее замечу, что всё моё имхо. ни на что не претендую. отзывы и флуд в тему принимаются.
Пример. Личная страница папы на папа.ру и мамы на мама.ру обьеденины общемы юзерами с одинаковыми правами. Или форум.папа.ру, папа.ру и блог.папа.ру имеют одинаковых юзверей.
При желании домены или субдомены должны разьединятся, не теряя контента. (к примеру на продажу).
Отсюда - у каждого сайта в связке должна быть своя база данных. и плюс одна общая для всех. Для друпала базы обязаны иметь одинаковый пароль и юзера к нему
Практика.
Копируем друпал в папку инсталляции как обычно. создаём домены и субдомены, которые указывают на эту папку.
в папке SITES отключаем папку default и создаём вместо неё для каждой домены и субдомены свою папку. я давал название без ввв. т.е. были созданы папки форум.папа.ру, папа.ру и блог.папа.ру. потом пришла мама и пришлось ещё сделать мама.ру.
В каждую из новых папок кидаем переделанный settings.php. На практике мною изменённый код выглядит так:
* $db_url = 'mysql://username:password@localhost/databasename';
* $db_url = 'mysqli://username:password@localhost/databasename';
* $db_url = 'pgsql://username:password@localhost/databasename';
*/
$db_url = 'mysql://multiuser:test@localhost/Baza-dannyh-nomer-1-for-papa'; ////юзер и пароль во всех одинаков, база данных своя
//$db_prefix = '';
$db_prefix = array(
'default' => 'Baza-dannyh-nomer-1-for-papa.', //// для каждого сайта своё
'users' => 'Baza-dannyh-nomer-0-for-all.',
'sessions' => 'Baza-dannyh-nomer-0-for-all.',
'role' => 'Baza-dannyh-nomer-0-for-all.',
'authmap' => 'Baza-dannyh-nomer-0-for-all.',
'sequences' => 'Baza-dannyh-nomer-0-for-all.',
'profile_fields' => 'Baza-dannyh-nomer-0-for-all.',
'profile_values' => 'Baza-dannyh-nomer-0-for-all.',
'users_roles' => 'Baza-dannyh-nomer-0-for-all.',
);
Запускаем папа.ру/install.php и вуаля первый сайт есть. меняем все сеттинги запускаем все инсталлы и все сайты в связке. Всё просто.
Проблемы начинаются потом. Кукисы и кэш.
Кукисы пришлось хакнуть, так как нельзя было логится на субдоменах, только на главной. почему так и не понял, пришлось заменить:
* We try to set the correct cookie domain. If you are experiencing problems
* try commenting out the code below or specifying the cookie domain by hand.
*/
if (isset($_SERVER['HTTP_HOST'])) {
$domain = '.'. preg_replace('`^www.`', '', $_SERVER['HTTP_HOST']);
// Per RFC 2109, cookie domains must contain at least one dot other than the
// first. For hosts such as 'localhost', we don't set a cookie domain.
if (count(explode('.', $domain)) > 2) {
ini_set('session.cookie_domain', $domain);
}
}
на
* We try to set the correct cookie domain. If you are experiencing problems
* try commenting out the code below or specifying the cookie domain by hand.
*/
if (isset($_SERVER['HTTP_HOST'])) {
$domain = "ПАПА.РУ";
#$domain = '.'. preg_replace('`^www.`', '', $_SERVER['HTTP_HOST']);
// Per RFC 2109, cookie domains must contain at least one dot other than the
// first. For hosts such as 'localhost', we don't set a cookie domain.
# if (count(explode('.', $domain)) > 2) {
ini_set('session.cookie_domain', $domain);
# }
}
И вуаля теперь то всё заработало, пока не пошла ошибка с кэшем.
* user warning: Table 'cache_menu' already exists query: CREATE TABLE ptchomdb24.cache_menu ( cid varchar(255) NOT NULL default '', data longblob, expire int NOT NULL default '0', created int NOT NULL default '0', headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
* user warning: Table 'cache_page' already exists query: CREATE TABLE ptchomdb24.cache_page ( cid varchar(255) BINARY NOT NULL default '', data longblob, expire int NOT NULL default '0', created int NOT NULL default '0', headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
Эта ошибка убирается с помощью 'cache_filter' => '', так как показано тут.
Теперь вопрос. без хака можно? он мне недели нервов стоил.
ps. забыл добавить. игрался на сайте. http://www.dinpellets.de/. Сейчас две домены к нему прикручены. Если кто хочет поиграться посмотреть. могу дать админские правы на друпал.
Комментарии
Будьте добры выложите пароли.
очень важная тема, я поднимал ее недавно. никто не ответил!
у Макса читал, правда давно . а сейчас вопрос стоит именно об этом.
я могу зарегенному юзеру дать права админа. регестрируйтесь и ник в личку. н.п.
Я почему-то всегда думал, что база данных должна быть одна для всех сайтов, а Друпал будет динамически распределать к какому сайта какие ноды и пр. относятся...
Поправьте меня если я не прав...
База может быть одна, но с разными префиксами для каждого сайта (фактически в рамках одной БД мы имеем несколько независимых наборов таблиц для каждого сайта). Либо могут быть разные базы данных для каждого сайта (тогда общим для всех сайтов остается только комплект скриптов Drupal). Либо тот вариант, который представлен здесь, когда сайты пользуются несколькими общими таблицами из одной базы данных, а все остальные таблицы держат в отдельных собственных БД.
Преимущества и недостатки этих вариантов расписаны в статье Макса.
Все, понял. Значит полностью не соединить их никак.... Хотя было навернео неплохо, чтобы можно было строить сеть сайтов (на поддоменах или на доменах) из одной админки и на одной базе (на одних префиксах).
Но, увы, как я понял - это утопия.
Почему нет? Это и есть вариант 1 из моего сообщения.
Более того, Drupal позволяет сделать еще более "распределенный мультисайтинг" - связать между собой сайты на разных доменах и с разными инсталляциями Drupal (наборами скриптов). Это позволяет делать механизм распределенной авторизации, который поддерживается Drupal (модуль Drupal).
Вот, например, как здесь - на drupal.ru я захожу под своим логином и паролем с drupal.org. У этих сайтов все отдельное - и базы и экземпляры Drupal-скриптов, и расположены на разных серверах, и доменные имена разные. Но они объединены совокупностью юзеров. В известном смысле - это тоже мультисайтинг.
В Drupal 6 будет еще круче - теперь он поддерживает OpenID, т.е. "объединяются" юзеры не только Drupal-сайтов, но LJ, WordPress и т.п.
опен айди мне лично не нужен. распределённая авторизация тоже, как бы. нужна авторизация для связки сайта, такая, чтобы человек и не подозревал, что это мультисайтинг. и чтобы кукисы назывались и выдавались той доменой, на которую он входит.
пс. когда шесть будет?
Вариант №1 :
А на счет модуля Drupal - это известно...
Я имел ввиду одну БД (с одними префиксами) и один надор скриптов...
Подобную систему я в свое время писал (работающую на cURL), но она очень грузила сервер и гоняла трафик. Бросил писать т.к. нужно было писать к ней кеширование и прочее, а не было времени.
мультисайтинг очень интересен как раз для серьёзных проектов, для распределения нагрузки.
блог.папа.ру с базой данных на один комп со своим айпи. форум.папа.ру на другой айпи. мамина база данных вообще на виртуальном хостинге может остаться. решение с одной базой данных в моем понимании мира не есть кошерное.
Вариант №1:
База может быть одна, но с разными префиксами для каждого сайта (фактически в рамках одной БД мы имеем несколько независимых наборов таблиц для каждого сайта).
Ну блин, мистика!
Вчера ночью сидел и писал статью сюда, на Друпал.ру, которую хотел назвать "Мультисайтинг. Не опять, а снова".
Не успел дописать, однако, и не залил, сегодня просыпаюсь - а тут - такое! Колдуны!
А если серьезно.... насчет кэша:
...headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
Эта ошибка убирается с помощью 'cache_filter' => '', так как по...
Когда вы прописали settings.php для вашего нового субдомена мама.ру, и зашли на мама.ру, Друпал выдал ошибку - и пральна - ведь нужных таблиц в БД еще нет. Друпал сгенерил страницу -
* user warning: Table 'cache_filter' already exists query: CREATE TABLE ptchomdb24.cache_filter ( cid varchar(255) NOT NULL default '', data longblob, expire int NOT NULL default '0', created int NOT NULL default '0', headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
* user warning: Table 'cache_menu' already exists query: CREATE TABLE ptchomdb24.cache_menu ( cid varchar(255) NOT NULL default '', data longblob, expire int NOT NULL default '0', created int NOT NULL default '0', headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
* user warning: Table 'cache_page' already exists query: CREATE TABLE ptchomdb24.cache_page ( cid varchar(255) BINARY NOT NULL default '', data longblob, expire int NOT NULL default '0', created int NOT NULL default '0', headers text, PRIMARY KEY (cid), INDEX expire (expire) ) /*!40100 DEFAULT CHARACTER SET UTF8 */ in /var/kunden/webs/ПАПА.РУ/includes/database.mysql.inc on line 172.
и закешировал ее. Поэтому когда вы заходите снова, на мама.ру, Друпал выдает вам кеш. (хорошая фраза:) наличные бы не помешали...) Если вы обновите страницу (а не просто перейдете по этому адресу), Друпал заново сгенерит ее. Он сгенерит снова с ошибками - ведь таблиц нет.
Поэтому сначала сделайте мама.ру/install.php , установите Друал для ЭТОГО домена - мама.ру. Если часть таблиц общая, то установщик выдаст ошибку, но данные в уже существующих таблицах затерты не будут.
После того как установите, обновите страницу мама.ру (а не просто перейдите по ней - в этом случае вы опять получите кеш с ошибками) и наслаждайтесь вашим мультисайтингом.
andron13
Это все понятно, просто конкретно мне интересно было бы управлять множеством сайтов из одной админки, с одной БД, под это дело естесственно берется VDS (речь не идет о виртуальном хостинге).
А есть всё же способ на Drupal из одной админки управлять контентом на разных сайтах при мультисайтинге? Добавлять именно разный контент, новые ноды и т.д.
Есть такой модуль - Мультисайтинг
Хотел его попробовать, однако ограничения установки отпугнули меня. На время )
Может вы окажетесь храбрее и потом расскажете нам о Вашей доблести? - http://drupal.org/project/multisite_manager
этот модуль вроде как раз для варианта с одной базой данных.
andron13, очень нужно, в тему и интересно ! Вопрос возник. Вы пишите базы на разных компьютерах (т.е. разные хосты), но судя по sittings для этого надо базы разные прописывать localhost, localhost.мама.ру и т.д., а как Вы будете с кодом на одном хостинге обращаться к базе на другом, насколько я знаю скрипт и база должна быть на одном хосте - хостинг эти ограничения блюдет свято ?
насколько я знаю. то можно брать виртуальный хостинг ради IP , а дополнительные базы брать со своего компа. и прописавыть просто не локалхост в сеттинге, а халявная-база-данных.на-другом-айпи.ру. пусть поправят если не прав.
я пока всегда везде локалхост вводил. но по теории строчка адреса не с пустого места была сделана.
Было интересно был ли опыт вместо localhost/databasename обращаться к базам на VPS или просто на других хостах, с точки зрения скорости работы, но все равно - респект
Опыт был: удаленная база, к которой присоединяются разные сайты. Т.к. у любого localhost есть внешний адрес...
Все работало, но конечно скорость удаленных сайтов была медленнее, т.е. нагруженные сайты лучше располагать на одном хосте с базой, ну или в одном ДЦ.
PS было очень удобно: добавить новость на один сайт, а она появлялась на 10 (вебдваноль прям), пока Яндекс не ввел санкции непотфильтра на подобные сайты.
topy, это тоже интересно, но речь шла именно о надежности и распределенности (чтобы не класть «яйца» в одну корзину ).
Для тех кто хочет поставить мультик локально под DENWER2 (изменения и добавления к вышеизложенному)::
1) Создать папку site2.ru (как обычно);
2) Restart Server;
3) Добавить в файл usr\local\apache\conf\httpd.conf
после абзаца # Если вы вручную хотите создать виртуальный
#sas рукодельный хост - парковка домена
# Host /home/site2.ru/www :
#Listen 127.0.0.1:80
#NameVirtualHost *:*
DocumentRoot "V:/home/site1.ru/www"
ServerName "site2.ru"
ServerAlias "site2.ru" "www.site2.ru"
ScriptAlias /cgi/ "/home/site1.ru/cgi/"
ScriptAlias /cgi-bin/ "/home/site1.ru/cgi-bin/"
ErrorLog "/home/site1.ru/error.log"
#sas рукодельный хост - парковка домена
4) В settings.php для site2.ru (каталог site2.ru расположен на /sites/ в папке хоста site1, как описывал Андрей)
я изменил только строчку
$db_url = 'pgsql://username:password@localhost/site2_base';
если не надо единую таблицу пользователей ( меня устраивает друпаловский дружественный регистратор - для зарегистрированной роли по умолчанию, а остальные права на пользователя для разных сайтов в мультике хочется раздавать по разному )
5) Restart Server;
При таком подходе проблем с cache, cookies замечены не были а сайты используют как общие модули так и собственные
Особая благодарность andron13
я прям засмущался. но если честно очень рад, что хоть кому то здесь серьёзно смог помочь. а то до сих всё мне и меня. у меня цель была именна в юзерах. распределённую авторизацию я наверное не понимаю. зачем она? в чём смысл? наверное во мне что то кулацкое ещё живёт :).
В копилку:
- У вас есть сайт на http://www.example.com
- Вы хотите создать второй на http://www.example.com/secondsite
- Drupal установлен в каталог /home/user/public_html
Тогда, если есть доступ к шеллу, можно использовать команды
- ln -s /home/user/public_html /home/user/public_html/secondsite (под Unix)
- junction /home/user/public_html/secondsite /home/user/public_html (под Windows)
Обратите внимание на отличающийся порядок аргументов ln и junction.
(пример из http://drupal.org/node/117658).
Если же доступа к шеллу нет, то можно создать symlinks посредством PHP-скрипта:
<?php
symlink ('/home/user/public_html', '/home/user/public_html/secondsite');
?>
Я так думаю, все развивается. Раньше каждый просил зарегестрирваться на своем сайте с несколькими целями:
1) Получить email и др. координаты (идентифицировать);
2) Некоторый порог ответственности юзверя ( для порядных, "вменяемых", хакеров не касается);
3) Раздать группам права и привелегии;
Когда сайтов стало достаточно, пользователя начала раздражать эта "кухня" вот и придумали OpenID (типа паспорта), которую сейчас в 6 версию поместили.
andron13 пишет: были созданы папки форум.папа.ру, папа.ру и блог.папа.ру. потом пришла мама и пришлось ещё сделать мама.ру.
Домены третьего уровня для мультисайтинга идеологически не совсем правильно.
Если все проекты из связки работают примерно в одном ключе, то тогда лучше их держать на одном домене.
Если проекты слишком разные, то тогда нужно сразу заводить отдельные домены под каждый сайт. Это позволит в будущем разделить мультисайтинговую связку и продавать сайты порознь.
andron13 пишет: Теперь вопрос. без хака можно? он мне недели нервов стоил.
Похоже, частично Ваши беды от того, что Вы использовали мультисайтинг для доменов третьего уровня.
andron13 пишет: При желании домены или субдомены должны разьединятся, не теряя контента. (к примеру на продажу).
Как Вы собираетесь продавать субдомен? Владельцем все равно останется владелец основного домена. В лучшем случае можно продать содержимое на домене третьего уровня, которое новый владелец разместит на своем домене. Но стоимость такого содержимого не очень высока:
Домены сейчас стоят очень дешево. Вместо домена третьего уровня проще сразу выносить содержимое на домен второго уровня. Это позволит в будущем продать его по полной цене.
Для увеличения комфортности посетителей, можно при мультисайтинге использовать модуль, который позволяет логинится на любом из сайтов связки, а потом спокойно переходить с сайта на сайт, не теряя логина-пароля.
Список таких модулей ведется и пополняется в конце статьи "Мультисайтинг - это просто".
Не мужики архитектура Друпала не готова для мультисайтовости. Объясню...
Допустим у нас имеется несколько сайтов с объеденёнными таблицами пользователей.
Мы хотим настроить настроить несколько модулей одинаково для всех сайтов.
И нарываемся на хер...
Реально все настройки модулей хранятся в БД. Или модуль создаёт свои таблицы с настройками, или (если их немного или их невозможно структурировать) в таблице variable.
Эта таблица в формате опция/значение (Например опция site_name - имя сайта). В ней то и загвоздка: если обычные таблицы с настройками можно объединить и сделать общей для всех подсайтов, то таблица variable должна быть отдельно для всех сайтов. Иными словами, настройки модулей можно копировать (вручную), но нельзя объединить.
Например есть простой и понятный модуль: birthdays
Он добавляет в профиль пользователя поле "Дата рождения". Он может в день варенья отправлять поздравления пользователю, может также оповещать админа о наступлении дня варенья у пользователя.
Вообщем хороший, простой модуль.
Если делать копии настроек этого модуля для всех сайтов (стандартный подход), то получается что каждый подсайт будет высылать поздравления пользователю. В итоге он получит кучу одинаковых поздравлений Объединить настройки этого модуля невозможно: он вписывает настройки в эту злополучную таблицу. Убрать этот модуль на подсайтах, а оставить только на главном нельзя, поскольку пропадёт поле даты рождения в профиле. Самое обидное что даже объеденив настройки модуль будет рассылать по несколько писем.
Кстати расскажите, а скрипт cron нужно делать отдельный для каждого подсайта?
И ещё вы так деликатно обходите проблему создания отдельной папки files для подсайтов.
Я думаю, что, объединив базу юзеров для всех своих сайтов, модуль дней рождения можно включить на одном из них, который будет для Вас основным. Тогда по базе юзеров поздравления будут рассылаться только один раз. Вообще, с творческим подходом можно легко выйти из большинства таких положений.
Что касается папки files....
Дело в том, что в папках настроек для каждого сайта (sites/papa.ru, sites/mama.ru и т.д.) можно сделать папки sites/papa.ru/modules, sites/papa.ru/themes, в которых будут размещаться соответственно модули и темы, доступные только для данного сайта. (Модули и темы, помещенные в соответствующих папках корневого каталога, могут быть доступны для всех сайтов мультисайтинга).
ВОПРОС: относится ли данное утверждение и к папке files? Если да, то вопрос решен легко и изящно. Правда, я не проверял этого.
Уважаемые, никто не пробовал делать так, чтобы профиль каждого юзверя был доступен по адресу user.site.com, тоесть каждому пользователю свой сабдомен. Если кто делал, поделитесь секретом
Ну почему же нет. Есть. Если сами сделаете поделитесь рецептом
http://drupal.ru/node/6227
http://drupal.ru/user/movit
http://drupal.ru/node/6505
Хорошая статья, впринципе все просто и понятно... Без проблем поднял 3 сайта, объединил таблицы, но как надо не заработало. Я ставил drupal 6.2
Автор по видимому 6.1 ?
у меня в файле includes/bootstrap.inc
нет строки
$domain = '.'. preg_replace('`^www.`', '', $_SERVER['HTTP_HOST']);
и коментирование 11 и 14 строк как в примере не привело ни к каким результатам...
Может кто подскажет готовое решение для друпала 6.2 ?
Я уже все облазил здесь...
зарегистрировавшись на одном из сайтов можно войти на любой в связке, но из за проверки куков автоматически сайт не узнает меня, может я что то не так понял? Помойму каждый сайт должен узнавать, но без хака bootstrap.inc не работает, и не хакается...
сорри за дополнение...
кукисы прописываются папе только. описание мультисайтинга для пятёрки. на дату посмотрите.
Меня все время перебрасывает с один.папа.ру на папу.ру Подозреваю - проблема с кукисами, стоит 5.7, не могу найти строчку
$domain = '.'. preg_replace('`^www.`', '', $_SERVER['HTTP_HOST']);
было бы неплохо указать имя файла где он ищется. Если можно конечно...
Не найдено решение для папки files. Вся мультисайтовая связка кидает файлЫ в одну кучу. Особенной проблемой становятся логотипы, которые начинают пересекаться.
Как разделить папки files для каждого сайта на drupal 5.7?
сделать для каждой свою ?
sites/имясайта/files ?
можете сделать пути вида /files/домен_сайта/ - для Друпал ветки 5.0
В шестёрке будет, как сказал Андрон - sites/домен_сайта/files
Маленький хинт: идем в файл settings.php в папке sites нужного домена, и что видим в конце?
"Перекрытие переменных:
Чтобы переопределить конкретные значения в таблице 'variables' для этого сайта, пропишите их здесь. Как правило, нет необходимости использовать эту особенность. Это полезно для конфигурации для вуртуального хоста (alias) или директории, которые отличаются от значений по умолчанию в settings.php. Можно переназначить любое значение таблицы 'variables'." (вольный перевод)
Таким образом, чтобы прописать другое название сайта (к примеру), вовсе не обязательно плодить таблицы variables, достаточно прописать в settings.php следующее:
'site_name' => 'Самый лучший сайт в мире'
);
Сюда бы ещё инфу, как настроить куки в шестой версии и будут ли ещё какие непредвиденные проблемы типа той, что возникла с кешем...
setting.php строка 169
$cookie_domain = '.ПАПА.РУ';
обратите внимание на точку, означает что кука ставиться для всех поддоменов)
Не пашет. Пробовал и с точкой и без точки. slawia.org и sobor.slawia.org
Решил проблему, прописав у обоих сайтов одинаковые строки с заданием переменной $cookie_domain
Так они и должны быть одинаковые для всех сайтов.