Вопрос по мультисайтингу

Главные вкладки

Аватар пользователя nukerster nukerster 20 апреля 2010 в 14:12

Добрый день, уважаемые разработчики!

Сразу хотелось бы попросить опытных участников, которым надоело отвечать на подобные вопросы по множеству раз не ругаться матом и не кричать, что очередному ламеру не охота лезть в Гугл. Если вы хотите сказать именно это, то уж лучше ничего не пишите...
Информации много и зачастую не везде она описывает одинаковые пути. И постоянно находятся люди, у которых что-то не работает и в итоге все темы по "мультисайтингу" в итоге превращаются в свалку ошибок, методов их исправления и ругани.
Просто если имеешь с чем-то дело в первый раз, то можно хоть год в Гугле с чем-то просидеть и всё равно не разобраться до конца. Поэтому надеюсь на конструктивную помощь и критику, а не на ругань.

Из прочитанного:
http://www.razgonka.ru/multisiting/
http://www.drupal.ru/node/6226
http://www.drupal.ru/node/12437
и даже почти всё из http://drupal.org/node/43816.
Из увиденного:
http://www.drupal.ru/node/37277
http://www.drupal.ru/node/36877
и http://gotdrupal.com/videos/multisites-vs-multiple-sites
После такого потока информации, я понял в принципе что к чему, но при этом порядком запутался...

Ситуация получается следующая. На данный момент есть сайт, разработанный на Друпале. Сайт один. А в итоге их нужно наплодить порядка штук 10-15. Все сайты будут однотипные, т.е. с одинаковым (ну или очень похожим) интерфейсом. С практически одними и теми же модулями и блоками. И (что очень важно!) с общими пользователями. Только контент у них будет разный. И ещё очень важный момент - это возможность пользоваться Shared Sign-On. Без него вся эта задумка с мультсайтингом для моего руководства теряет смысл... Beee

И вот, собственно, сразу начинаются сомнения:
Думаю делать всё в одной базе с префиксами - это будет просто нереально, потому что у меня у одного единственного сайта уже порядка 100 таблиц. Следовательно, если сайтов будет 10, то таблиц будет около тысячи... И всё это навивает грусть.
Если делать с одной общей базой (пользователей, ролей и т.д.) и остальными независимыми для каждого сайта, то опять берут сомнения:
В моём распоряжении волею руководства сейчас находится Виртуальный хостинг на HC.RU (он же РБК). Создать несколько баз с одним и тем же пользователем (о чём повествуется в статье http://www.razgonka.ru/multisiting/), скорее всего не получится, потому что:
Допустим у меня есть домен drupalsite.ru - база для него автоматически создаётся с именем wwwdrupalsiteru. Если создаёшь вторую базу, например с именем db2, то имя у неё получается уже wwwdrupalsiteru_db2. И подключение к ним происходит по логинами drupalsite и drupalsite_db2 соответственно. Хотя вот в этой статье - http://drupal.org/node/348619 всё как-то легко и просто... Без одинаковых логинов к базам.
Потом, если всё же получится создание разных баз и одной общей, я так понимаю, нужно создать в директории sites, куда установлен Друпал, папки для каждого из сайтов, допустим /sites/drupalsite1.ru, /sites/drupalsite2.com, /sites/drupalsite3.org. И в каждой из директорий создать конфигурационный файл settings.php с префиксами для базы. Вот я думаю, уже на данном этапе всё ли я понял правильно?
Читал статьи в основном про установку на Локалхост, но хотелось бы понять как это делать уже на боевом хостинге. Что делать с доменными именами? Допустим, у меня есть домен drupalsite1.ru, вот на нём есть уже готовый одиночный сайт на Друпале. Чтобы размножить его, мне нужно привязать к нему алиасы drupalsite2.com и drupalsite3.org?
А потом уже залить копию его базы в отдельные базы для drupalsite2.com и drupalsite3.org (за исключением таблиц, которые будут общими)? Нужно ли вносить какие-либо изменения в httpd.conf, если меня заставят это делать на VPS-хостинге? И вообще возможно ли всё это сделать на Виртуальном хостинге или по-любому нужен VPS?

Буду искренне признателен за любую помощь в виде советов. Если я где-то что-то неправильно понял и описал, то подскажите какой порядок действий будет правильным?

P.S.: Заранее благодарен! Smile И будьте взаимовежливы, а то, как это бывает, польют грязью а что делать не скажут Beee

Комментарии

Аватар пользователя nukerster nukerster 20 апреля 2010 в 15:10

Спасибо за ссылку, но этот вариант, я думаю относится к реализации в одной БД с разными префиксами для каждого сайта. А в моих условиях этот вариант скорее всего не подходит из-за того, что в итоге получится база с тысячами таблиц.
Но сама статья, кстати, очень занимательная. Для небольшого количества сайтов очень удобно! Smile

Аватар пользователя Oleksa@drupal.org Oleksa@drupal.org 20 апреля 2010 в 15:46

"nukerster" wrote:
но этот вариант, я думаю относится к реализации в одной БД с разными префиксами

не правильно думаете
"nukerster" wrote:
Для небольшого количества сайтов очень удобно! :)

а как вы измеряете?

Аватар пользователя pselfin pselfin 20 апреля 2010 в 17:54

"nukerster" wrote:
нужно создать в директории sites, куда установлен Друпал, папки для каждого из сайтов, допустим /sites/drupalsite1.ru, /sites/drupalsite2.com, /sites/drupalsite3.org

Правильно
"nukerster" wrote:
И в каждой из директорий создать конфигурационный файл settings.php с префиксами для базы.

Правильно
"nukerster" wrote:
у меня есть домен drupalsite1.ru, вот на нём есть уже готовый одиночный сайт на Друпале. Чтобы размножить его, мне нужно привязать к нему алиасы drupalsite2.com и drupalsite3.org?

Не совсем понял.
Нужно что бы для имен drupalsite1.ru, drupalsite2.com и drupalsite3.org корневая директория (rootdirectory) вела на папку с установленным друпалом. Некоторые шареды дают такую возможность, нужно смотреть конкретный тариф и связываться с техподдержкой.
"nukerster" wrote:
А потом уже залить копию его базы в отдельные базы для drupalsite2.com и drupalsite3.org (за исключением таблиц, которые будут общими)?

Опять же не понял... У тебя же материалы разные, зачем дублировать БД?
==
Зы связывать, по моему мнению, имеет смысл только таблицы с пользователями(права, поля, сессии и тд), а все остальное у каждого сайта свое(тобишь модули отдельно включить для каждого, темы и тд).
В твоем случае если не переделывать то основной пользовательской БД будет от имеющегося сайта, остальные к ней подключатся.
Как-то так Wink

Аватар пользователя nukerster nukerster 20 апреля 2010 в 20:25

"<a href="mailto:Oleksa@drupal.org">Oleksa@drupal.org</a>" wrote:
не правильно думаете

Может быть. Просто не всё ещё для себя прояснил...

"<a href="mailto:P.Selfin@drupal.org">P.Selfin@drupal.org</a>" wrote:
Не совсем понял.
Нужно что бы для имен drupalsite1.ru, drupalsite2.com и drupalsite3.org корневая директория (rootdirectory) вела на папку с установленным друпалом. Некоторые шареды дают такую возможность, нужно смотреть конкретный тариф и связываться с техподдержкой.

Ну просто вот на тарифе, который я сейчас использую, там можно для домена задать до 15-ти алиасов (синонимов или как их правильно назвать). В общем, если я для домена drupalsite1.ru задам алиасы drupalsite2.com и drupalsite3.org, то все они по сути будут ссылаться на drupalsite1.ru, а он собственно и есть тот самый основной сайт, основная инсталляция Друпала... Может я что-то не так себе представляю, но вроде бы должно быть так.

"<a href="mailto:P.Selfin@drupal.org">P.Selfin@drupal.org</a>" wrote:
Опять же не понял... У тебя же материалы разные, зачем дублировать БД?

Просто у меня есть костяк сайта. Там наполнения материалом ещё никакого нет почти. Только созданы Типы материалов, Views, Словари таксономии и настройки для модулей. Всего этого достаточно много и потом заново всё это создавать и настраивать ну как-то не совсем хочется. Все эти перечисленные вещи для всех сайтов будут одинаковые, поэтому я и подумал, что можно размножить все эти таблички для каждой базы, а в отдельную базы вынести юзеров, роли и сопутствующее.

Аватар пользователя pselfin pselfin 20 апреля 2010 в 22:28

"nukerster" wrote:
В общем, если я для домена drupalsite1.ru задам алиасы drupalsite2.com и drupalsite3.org, то все они по сути будут ссылаться на drupalsite1.ru, а он собственно и есть тот самый основной сайт, основная инсталляция Друпала... Может я что-то не так себе представляю, но вроде бы должно быть так.

Кажись нет. Алиас = синоним, перенаправление, а надо что бы было так, как я написал выше (в общем это прояснить нужно.
"nukerster" wrote:
подумал, что можно размножить все эти таблички для каждой базы, а в отдельную базы вынести юзеров, роли и сопутствующее.

Хм.. не сразу сообразил о чем речь.
Тогда получается так примерно:
1. Каталоги для сайтов в sites/
2. Дублируем БД для каждого сайта
3. Настройка settings.php для каждого сайта (основная БД у каждого своя, общие пользовательские таблицы в отдельной БД)
4. Решаем вопрос с root directory (разбираемся с алиасами)
5. Проверяем

Аватар пользователя WiseMan WiseMan 20 апреля 2010 в 23:23

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

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

Аватар пользователя solomenikm solomenikm 21 апреля 2010 в 10:38

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

Аватар пользователя Oleksa@drupal.org Oleksa@drupal.org 20 апреля 2010 в 23:44

Вставьте в /sites/drupalsite1.ru/setting.php (главный сайт откуда будут браться пользователи для других сайтов в мультисайтинге)

*/
$db_url = 'mysqli://drupalsite:парольlocalhost/db2';
$db_prefix = '';

/**
 * Access control for update.php script

Вставьте в /sites/drupalsite2.com/setting.php

*/
$db_url = 'mysqli://drupalsite_db2:парольlocalhost/wwwdrupalsiteru_db2';
$db_prefix = array(
    'default' => '',
    'users' => 'db2.',
);

/**
 * Access control for update.php script

Все ваш мультисайтинг готов (кол-во сайтов значения не имеет, все зависит от возможностей хостинга)

Аватар пользователя WiseMan WiseMan 21 апреля 2010 в 13:13

"<a href="mailto:Oleksa@drupal.org">Oleksa@drupal.org</a>" wrote:
Вставьте в /sites/drupalsite2.com/setting.php

<?php$db_url = 'mysqli://drupalsite_db2:парольlocalhost/wwwdrupalsiteru_db2';
$db_prefix = array(
    'default' => '',
    'users' => 'db2.',
);?>

Да ладно?! Lol а вы пробовали так делать, при разных именах пользователей баз данных? Wink

Это ж как же данный сайт будет подключаться к базе данных db2 если у нее совершенно другой пользователь.
Хотя... может я что-то пропусти и теперь это можно делать )

Аватар пользователя Oleksa@drupal.org Oleksa@drupal.org 21 апреля 2010 в 14:35

"WiseMan" wrote:
Да ладно?! Lol а вы пробовали так делать, при разных именах пользователей баз данных? Wink

А вы не подумали, что drupalsite_db2, тоже имеет права на работу с db2 Wink

Аватар пользователя WiseMan WiseMan 21 апреля 2010 в 14:41

"<a href="mailto:Oleksa@drupal.org">Oleksa@drupal.org</a>" wrote:
А вы не подумали, что drupalsite_db2, тоже имеет права на работу с db2 ;)

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

Аватар пользователя WiseMan WiseMan 22 апреля 2010 в 12:41

вот-вот )

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

Тогда к моему ответу, кроме смены хостинга и модуля domain добавляется вариант - обратиться в тех. поддержку... а вдруг )

Аватар пользователя nukerster nukerster 22 апреля 2010 в 14:30

В общем, что получилось: с префиксами и сотнями таблиц работает всё отлично!
С раздельными БД вот что происходит:

Для главного сайта, в базе которого хранятся его собственные таблицы + общие таблицы прописываю:

$db_url = 'mysqli://drupalsite1:pass1@localhost/wwwdrupalsite1ru';
$db_prefix = '';

Для второго сайта пишу:

$db_url = 'mysqli://drupalsite2:pass2@localhost/wwwdrupalsite2ru';
$db_prefix = array(
        'default' => '',
        'users' => 'wwwdrupalsite1ru.'
);

В ответ получаю:
Warning: SELECT command denied to user 'wwwdrupalsite2ru'@'localhost' for table 'users' query: SELECT u.*, s.* FROM wwwdrupalsite1ru.users u INNER JOIN wwwdrupalsite1ru.sessions s ON u.uid = s.uid WHERE s.sid = 'deedf953b66905d069e53a7be95f782c' AND s.domain = 'drupalsite1.ru' in /www/drupalsite1/www/htdocs/includes/database.mysqli.inc on line 128

Ну, в общем-то, всё печально очевидно - у базы wwwdrupalsite2ru нет доступа на подключение к базе wwwdrupalsite1ru...
Что можно сделать в данной ситуации? Ведь получается, что вторая БД видит первую! Можно ли задать в префиксе строку с паролем (мысли вслух) или ещё как-то?

Аватар пользователя Oleksa@drupal.org Oleksa@drupal.org 22 апреля 2010 в 16:15

nukerster Вы все правильно делаете осталось только сделать то, что мы уже обсудили с WiseMan и -OC-drupal.org , т.е. дать пользователю drupalsite2 , права на работу с базой wwwdrupalsite1ru.
У меня американский хостинг и cpanel , это делается в один клик мышкой. Как это на вашем хостинге не подскажу. Но думаю напишите им в тех.поддержку должны сделать.

Аватар пользователя nukerster nukerster 23 апреля 2010 в 13:37

Связался с тех. поддержкой. Ну и получил ожидаемый ответ про то, что в рамках Виртуального хостинга (по крайней мере у HC.ru) такое осуществить не получится. Если нужны базы с одним пользователем и правами, то нужно брать VPS. Со следующей недели получаю его в своё распоряжение и начинаю главу "Настройка мультисайтинга - Часть II. VPS" Smile
По идее, руководствуясь всеми приведёнными здесь инструкциями (кстати, всем спасибо огромное, особенно Oleksa@drupal.org) должно всё получиться без проблем. Единственный момент, который немного настораживает - это то, что на Виртуальном хостинге алиас привязывался в 2 клика, а на VPS наверное надо будет ещё httpd.conf править. Прописывать там <VirtualHost>. Ну это если, опять же, я ничего не путаю...
Буду настраивать и буду отписываться сюда. Может кому-нибудь в дальнейшем пригодится.

Аватар пользователя pselfin pselfin 23 апреля 2010 в 16:51

Так у них же есть нормальная спанель (тариф МИР-2). Через нее можно пользователя прикрепить к разным пользователям. Или я что-то здесь не понимаю)))