Мы — долго запрягаем, быстро ездим, и сильно тормозим.
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


Дмитрий, 2006-05-29 в 17:56:19

а вот интересно, можно ли одновременно использовать бд и виртуалхосты в апаче?

lissyara, 2006-05-29 в 18:04:58

Легко. Прям на этом сервере так сделано...

Дмитрий, 2006-05-29 в 18:13:56

А вот у меня что то не хочет, правда я из исходников все ставил, а не из портов!
что я делаю не так?

Kakoc, 2006-12-29 в 21:08:22

Nerabotaet !!!

ProFTP, 2008-05-02 в 1:23:31

а как сделать bla-bla .microsoft.com??

alov000, 2009-04-06 в 12:08:09

А на apache22 будет работать???

OzZy, 2010-03-23 в 12:24:05

Кто нибудь собирал под apache 2?

ss25, 2011-03-30 в 14:53:22

Оно будет работать с Apache 2.2 mpm-itk и PostgreSQL?



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0548 секунд
Из них PHP: 41%; SQL: 59%; Число SQL-запросов: 77 шт.
Исходный размер: 33671; Сжатая: 7679