Multiuser WordPress

Задача

Сделать доступным блогосервис с адресами вида http://blogs.ungrund.org/<user>

Условия

Debian GNU/Linux 'Lenny', день свободного времени.

Решение

Спрашиваем у aptitude, что оно знает о блогах:

aptitude search ~dblog

Десять минут листаем домашние странички различных маргинальных проектов, плюем на все и ставим таки WordPress. По зависимостям вытаскиваются ошметки x11, которые тянет за собой по жестким зависимостям php5-gd. Неприятно, но не смертельно.

WordPress использует базу данных MySQL (возможно умеет и другие) для хранения собственно данных: постов, комментариев, пользователей и прочего. И набор “юзеронезависимых” файлов, вроде шаблонов и похапе скриптов. Соответственно, в теории достаточно иметь только один набор шаблонов и несколько таблиц в БД, выбор которых для записи должен осуществляться на основании адреса, с которого попросили блог.

Есть несколько вариантов организации “мультиблоговости”:

  1. Для каждого блога — свой path внутри одного домена: example.org/blogs/;
  2. Для каждого блога — свой домен: .example.org.

WordPress в дебиане по умолчанию умеет создавать несколько вариантов себя, используя одну инсталляцию, но это возможно только для второго случая, т.е. создавая и используя таблицы, основываясь на FQDN блога, что не соответствовало ТЗ. Первый же вариант в дебиане по дефолту не работает, потому что все блоги находятся в одном домене и WP не может выбрать соответствующую таблицу (набор таблиц).

Этот досадный недостаток исправляется расширением (не плагином!) Virtual Multiblog. Решение красивое, никакой модификации файлов WP не происходит, установка и настройка заключаются в копировании пары .php файлов вглубь инсталляции WP и модификации конфига.

Процедура настройки несложная, сводится к следующим действиям (на примере тестового домена dev.ungrund.org/wordpress и двух юзеров user1 и user2):

Создаем виртуальный хост и пару юзеров. Как видно, user1 и user2 указывают на один набор файлов инсталляции wp.

mkdir -p /srv/www/dev.ungrund.org/wordpress
ln -s /usr/share/wordpress/ /srv/www/dev.ungrund.org/wordpress/user1
ln -s /usr/share/wordpress/ /srv/www/dev.ungrund.org/wordpress/user2
# Не забыть
mkdir /var/log/apache2/dev.ungrund.org

Настраиваем вхосты апача, обычная бла-бла.

/etc/apache2/sites-available/dev.ungrund.org

<VirtualHost *:80>
        ServerName dev.ungrund.org
        ServerAdmin webmaster@ungrund.org
        # default
        #UseCanonicalName Off
        # default
        #Options All
 
        #VirtualDocumentRoot /srv/www/%0
        DocumentRoot /srv/www/dev.ungrund.org/
 
        ErrorLog /var/log/apache2/dev.ungrund.org/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/dev.ungrund.org/access.log combined
 
        # Controlled by ServerTokens
        ServerSignature On
        # Store uploads in /srv/www/wp-uploads/$0
        #RewriteEngine On
        #RewriteRule ^/wp-uploads/(.*)$ /srv/www/wp-uploads/%{HTTP_HOST}/$1
</VirtualHost>
a2ensite dev.ungrund.org
# Если это еще не сделано
a2enmod php5

Собственно, занимаемся multiblog-ом

wget http://striderweb.com/wp-content/docs/nerd/downloads/multiblog.zip
unzip -d /usr/share/wordpress/wp-content/ multiblog.zip
cd /usr/share/wordpress
mv wp-content/multiblog{,-2.5}
mv wp-config{,-debian}.php
cp wp-content/multiblog-2.5/wp-config*.php .
mv wp-config{,-2.5}.php
ln -s wp-config{-2.5,}.php
mv wp-content/multiblog-2.5/config/mb-autoconfig{-sample,}.php
mv wp-content/multiblog-2.5/config/mb-users{-sample,}.php
# Создаем директорию для загружаемых файлов (для картинков, и прочего медиа-контента)
# Выставляем корректные права
mkdir /usr/share/wordpress/wp-content/uploads
chown www-data:www-data /usr/share/wordpress/wp-content/uploads

VMB подгружает следующие файлы из config:

  • mb-autoconfig.php: Конфигурация по умолчанию (база данных, язык, etc)
  • mb-users.php: Список пользователей. Хорошо использовать в случае, если есть блоги как в разных, так и в одном домене на одной системе.
  • mb-config-VUSER: Специфичные для того или иного блога VUSER (определенного в mb-users.php) опции, переопределяющие установки из mb-autoconfig.php.

Правим mb-autoconfig.php; название базы и имя пользователя могут быть почти произвольными.

/usr/share/wordpress/wp-content/multiblog-2.5/config/mb-autoconfig.php

<?php
if ( ! defined( 'ABSPATH' ) ) exit();   // sanity check
 
// ** MySQL settings ** //
$vmb_const['DB_NAME'] = 'wordpress';    // The name of the database
$vmb_const['DB_USER'] = 'wordpress';    // Your MySQL username
$vmb_const['DB_PASSWORD'] = 'blah'; // ...and password
$vmb_const['DB_HOST'] = 'localhost';    // 99% chance you won't need to change this value
$vmb_const['DB_CHARSET'] = 'utf8';
$vmb_const['DB_COLLATE'] = '';
 
// Change each KEY to a different unique phrase.  You won't have to remember 
// the phrases later, so make them long and complicated.  You can visit
// http://api.wordpress.org/secret-key/1.1/ to get keys generated for you, 
// or just make something up.  Each key should have a different phrase.
$vmb_const['AUTH_KEY'] = '123';
$vmb_const['SECURE_AUTH_KEY'] = '456';
$vmb_const['LOGGED_IN_KEY'] = '789';
 
// Change this to localize WordPress.  A corresponding MO file for the
// chosen language must be installed to wp-content/languages.
// For example, install de.mo to wp-content/languages and set WPLANG to 'de'
// to enable German language support.
$vmb_const['WPLANG'] = 'ru_RU';
 
// In WordPress 2.6+ you can change the location of wp-content and/or plugins
// $vmb_const['WP_CONTENT_DIR'] = '';
// $vmb_const['WP_CONTENT_URL'] = '';
// $vmb_const['WP_PLUGIN_DIR'] = '';
// $vmb_const['WP_PLUGIN_URL'] = '';
 
// Set $vmb_core_only to true if you want to turn *off* the "plugin" functionality
// $vmb_core_only = true;
 
/* That's all, stop editing! Happy blogging. */
 
?>

Следом /usr/share/wordpress/wp-content/multiblog-2.5/config/mb-users.php:

/usr/share/wordpress/wp-content/multiblog-2.5/config/mb-users.php:

<?php
if ( !defined('ABSPATH') ) exit();
$vusers[] = 'dev.ungrund.org/wordpress/user1';
$vusers[] = 'dev.ungrund.org/wordpress/user2';
// as a variant
//$vusers[] = 'dev2.ungrund.org';
$mydomain = '';
?>

Наконец, нужно определить директорию с кодом VMB в wp-config.php (поскольку из multiblog мы переименовали ее в multiblog-2.5. Если этого не делать, то без дополнительной конфигурации будет использована директория по умолчанию, multiblog). Раскомментировать строчки 25 и 32 в /usr/share/wordpress/wp-config.php, дописав нужные пути:

/usr/share/wordpress/wp-config.php

define( 'VMB_DIR', '/usr/share/wordpress/wp-content/multiblog-2.5/' );
define( 'VMB_CONFIG_DIR', '/usr/share/wordpress/wp-content/multiblog-2.5/config/' );

.htaccess используется wp для фичи permalink, которая, используя mod_rewrite, переписывает адреса постов с дефолтного /?=123 на что-нибудь более красивое. В обычных конфигурация веб-серверу нужно дать доступ на запись к .htaccess, в нашем случае его надо ЗАПРЕТИТЬ и написать следующее: (файл /usr/share/wordpress/.htaccess ссылка на /etc/wordpress/htaccess)

/etc/wordpress/htaccess

RewriteEngine On
RewriteCond %{REQUEST_URI} (/user1|/user2)?/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . %1/index.php [L]
 
# BEGIN WordPress
# END WordPress

Тут пароль к БД

chgrp www-data wp-content/multiblog/config/mb-autoconfig.php
chmod o-r wp-content/multiblog/config/mb-autoconfig.php

Создаем БД

mysql --defaults-extra-file=/etc/mysql/debian.cnf

Название базы и имя пользователя должны соответствовать настройкам в /usr/share/wordpress/wp-content/multiblog/config/mb-autoconfig.php

CREATE DATABASE wp_mb_test1;
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER on wp_mb_test1.* to "wp_mb_test1"@"localhost" identified BY "blah";

Не забыть настроить DNS. Goto http://dev.ungrund.org/wordpress/user1, http://dev.ungrund.org/wordpress/user2

Enjoy!

Как бы все.

ЛОР, привет.