Задача
Сделать доступным блогосервис с адресами вида http://blogs.ungrund.org/<user>
Условия
Debian GNU/Linux 'Lenny', день свободного времени.
Решение
Спрашиваем у aptitude, что оно знает о блогах:
aptitude search ~dblog
Десять минут листаем домашние странички различных маргинальных проектов, плюем на все и ставим таки WordPress. По зависимостям вытаскиваются ошметки x11, которые тянет за собой по жестким зависимостям php5-gd. Неприятно, но не смертельно.
WordPress использует базу данных MySQL (возможно умеет и другие) для хранения собственно данных: постов, комментариев, пользователей и прочего. И набор “юзеронезависимых” файлов, вроде шаблонов и похапе скриптов. Соответственно, в теории достаточно иметь только один набор шаблонов и несколько таблиц в БД, выбор которых для записи должен осуществляться на основании адреса, с которого попросили блог.
Есть несколько вариантов организации “мультиблоговости”:
- Для каждого блога — свой path внутри одного домена:
example.org/blogs/; - Для каждого блога — свой домен:
.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!
Как бы все.
ЛОР, привет.