|
www.lissyara.su
—> статьи
—> FreeBSD
—> WWW
—> mod_shapvh
mod_shapvh - для хранения виртуальных хостов в БД
Автор: lissyara.
Интереснейший и полезнейший модуль к апаче1.3 - mod_shapvh он позволяет хранить виртуальные хосты в БД MySQL. Самый глвный плюс - при добавлении нового виртуального хоста не требуется перезапуск апача - он подхватывает изменения на лету. Насчёт быстродействия - при грамотно составленной таблице с хостами замедления не будет даже при большом количестве виртуальных хостов (аффтар тестировал с 6000 хостов).
Ставим из портов:
/usr/ports/>
/usr/ports/>make search name='mod_shapvh'
Port: mod_shapvh-1.0
Path: /usr/ports/www/mod_shapvh
Info: Apache module that provides virtual hosts from a database
Maint: steven@krx.nl
B-deps: apache-1.3.34_4 expat-2.0.0 mysql-client-4.1.16_1 perl-5.8.7_2
R-deps: apache-1.3.34_4 expat-2.0.0 mysql-client-4.1.16_1 perl-5.8.7_2
WWW: http://www.crazygreek.co.uk/content/mod_shapvh
/usr/ports/>cd /usr/ports/www/mod_shapvh
/usr/ports/www/mod_shapvh/>make && make install && make clean
| После инсталляции топаем править конфиг апача - /usr/local/etc/apache/httpd.conf, для начала, раскомментируем модуль:
LoadModule shapvh_module libexec/apache/mod_shapvh.so
AddModule mod_shapvh.c
| После чего добавляем следующие строки:
<IfModule mod_shapvh.c>
# Включить, или выключить модуль
ShapVHOn on
# Имя хоста на котором крутится MySQL
ShapVhHost localhost
# Имя пользователя для соединения с БД
ShapVhUser apache
# Пароль для соединения с MySQL
ShapVhPass apache
# БД в которой хранятся данные по виртуальным хостам
ShapVhDbName apache_sql
# Дефолтовый путь к директории хранения документов. Используется
# в случае, если не найден путь в БД или произошла ошибка
# у меня например, было такое когда я назначил UID
# меньше 1000
ShapVhDefaultRoot "/usr/local/share/doc/apache/"
# Мыло админа (которое при ошибках показывается) оно
# будет показано в случае, если мыло не найдено в БД
ShapVhDefaultAdmin admin@lissyara.su
# Кверя к БД. Должна вернуть, в зависимости от настройки
# параметры виртуального хоста. В данном случае:
# путь к документам, UID пользователя, мыло админа,
# GID пользователя
ShapVhQuery "SELECT `data_dir`, `uid`, `e_mail`, `gid` \
FROM `hosts_list` WHERE `hostname` = '%s' \
AND `active`='1'"
# конец директивы :) Или директиве :)
</IfModule>
| Затем создаём таблицы в БД:
-- phpMyAdmin SQL Dump
-- version 2.6.0-beta2
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Фев 13 2006 г., 10:51
-- Версия сервера: 4.0.25
-- Версия PHP: 4.4.1
--
-- БД: `apache_sql`
--
-- --------------------------------------------------------
--
-- Структура таблицы `hosts_list`
--
CREATE TABLE `hosts_list` (
`unic_id` int(11) NOT NULL auto_increment,
`hostname` varchar(255) NOT NULL default '',
`host_descriptions` varchar(255) default NULL,
`data_dir` varchar(255) NOT NULL default '',
`uid` int(32) default '1001',
`e_mail` varchar(255) NOT NULL default '',
`gid` int(32) default '1001',
`active` enum('1','0') NOT NULL default '0',
PRIMARY KEY (`unic_id`),
UNIQUE KEY `hostname` (`hostname`)
) TYPE=MyISAM COMMENT='Таблица виртуальных хостов апача' AUTO_INCREMENT=9 ;
| И вносим в них некоторые данные по тем хостам что есть:
--
-- Дамп данных таблицы `hosts_list`
--
INSERT INTO `hosts_list` VALUES (1, 'forum.lissyara.su', 'Форум моего сайта',
'/usr/home/lissyara/forum.lissyara.su', 1001, 'admin@lissyara.su', 1001, '1');
INSERT INTO `hosts_list` VALUES (2, 'lissyara.su', 'Мой домен, но сайта тут нету.',
'/usr/home/lissyara/lissyara.su', 1001, 'admin@lissyara.su', 1001, '1');
INSERT INTO `hosts_list` VALUES (3, 'www.lissyara.su', 'Мой сайт',
'/usr/home/lissyara/www.lissyara.su', 1001, 'admin@lissyara.su', 1001, '1');
INSERT INTO `hosts_list` VALUES (4, 'test.lissyara.su', 'Мой тестовый домен',
'/usr/home/lissyara/test.lissyara.su', 1001, 'admin@lissyara.su', 1001, '1');
| Наверно заинтересует откуда взялось число `1001` - это мой UID - вначале я хотел поставить 80 - это апачёвый, но в код встроена проверка, и не получилось (в-принципе, я это место нашёл, но править стало лень :)) Также не забудте создать пользователя для БД (или дать права на SELECT, если используете существующего). После этого перезапускаем апач:
/usr/local/etc/apache/>/usr/local/etc/rc.d/apache.sh restart
Stopping apache.
Waiting for PIDS: 22982.
Starting apache.
/usr/local/etc/apache/>ps -ax | grep httpd
27508 ?? Ds 0:02,85 /usr/local/sbin/httpd
27685 p0 S+ 0:00,02 grep httpd
/usr/local/etc/apache/>
| И пробуем. Должно всё взлететь. Соответственно - можно написать админку на php или ешё чем. Админка-то будет в пять строк :) также хочу заметить, что директива ВиртуалХостс в конфиге не включена. Вернее она у меня была включена, но я её отключил, вместе со всеми хостами что были жёстко вписаны в конфиге. Всё работает.
Также, есть ещё один вариант использования модуля - типа когда много юзеров, и надо каждому выдать свой хомяк (наверно актуально для интернет-провайдеров... Но не для меня). Из любопытства попробовал на тестовой машине и этот режим. Конфиг чуть меняется:
<IfModule mod_shapvh.c>
# Включить, или выключить модуль
ShapVHOn on
# Имя хоста на котором крутится MySQL
ShapVhHost localhost
# Имя пользователя для соединения с БД
ShapVhUser apache
# Пароль для соединения с MySQL
ShapVhPass apache
# БД в которой хранятся данные по виртуальным хостам
ShapVhDbName apache_sql
# Дефолтовый путь к директории хранения документов. Используется
# в случае, если не найден путь в БД или произошла ошибка
# у меня например, было такое когда я назначил UID
# меньше 1000
ShapVhDefaultRoot "/usr/local/share/doc/apache/"
# Мыло админа (которое при ошибках показывается) оно
# будет показано в случае, если мыло не найдено в БД
ShapVhDefaultAdmin admin@lissyara.su
# Кверя к БД. Должна вернуть, в зависимости от настройки
# параметры виртуального хоста. В данном случае:
# путь к документам, UID пользователя, мыло админа,
# GID пользователя
ShapVhQuery "SELECT \
CONCAT('/usr/home/', `VISP`, '/', LEFT(`username`,1),\
'/', `username`, '/htdocs'), `uid`, \
CONCAT('postmaster', '@', `username`, '.', `VISP`), \
`gid` FROM `users_table` WHERE `username` = '%s' \
AND `VISP`='%s'"
# Включение или выключение VISP
ShapVhVISP on
# конец директивы :) Или директиве :)
</IfModule>
| После чего создаём таблицу:
-- phpMyAdmin SQL Dump
-- version 2.7.0-pl2
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Фев 13 2006 г., 14:00
-- Версия сервера: 5.0.18
-- Версия PHP: 4.4.2
--
-- БД: `apache_sql`
--
-- --------------------------------------------------------
--
-- Структура таблицы `users_table`
--
CREATE TABLE `users_table` (
`unic_id` int(8) NOT NULL auto_increment,
`username` varchar(25) NOT NULL default '65535',
`VISP` varchar(60) NOT NULL default 'lissyara.su',
`uid` int(4) NOT NULL default '0',
`gid` int(4) NOT NULL default '0',
`home` varchar(255) NOT NULL,
PRIMARY KEY (`unic_id`)
) ENGINE=MyISAM DEFAULT AUTO_INCREMENT=3 ;
--
-- Дамп данных таблицы `users_table`
--
INSERT INTO `users_table` VALUES (1, 'lissyara', 'microsoft.com', 1001, 1001, '');
INSERT INTO `users_table` VALUES (2, 'admin', 'microsoft.com', 1001, 1001, '');
| Также создаём директории по указанному пути:
/usr/home/>mkdir microsoft.com
/usr/home/>cd microsoft.com/
/usr/home/microsoft.com/>mkdir -p a/admin/htdocs
/usr/home/microsoft.com/>mkdir -p l/lissyara/htdocs
/usr/home/microsoft.com/>ls
a l
/usr/home/microsoft.com/>echo '<br><br>WORK!' > a/admin/htdocs/index.html
/usr/home/microsoft.com/>echo '<br><br>WORK!' > l/lissyara/htdocs/index.html
/usr/home/microsoft.com/>
| Опосля чего я подправил свой hosts и попробовал сходить по адресу www.admin.microsoft.com и www.lissyara.microsoft.com - всё пашет. Разумеется в реальных условиях надо делать скрипт, который и будет создавать директории.
Косяки: оказывает дурное воияние на модуль подсчёта траффика - mod_accounting - он начинает думать что всё пришло и отправлено на тот хост, который указан в директиве ServerName... Но - считает правильно....
размещено: 2006-02-13,
последнее обновление: 2006-02-13,
автор: lissyara
|
|
Комментарии пользователей [8 шт.]