Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  hosting
  mod_gzip
  mod_log_sql
  mod_geoip
  mod_bandwidth
  mod_accounting
  mod_bunzip2
  mod_mp3
  mod_shapvh
  mod_limitipconn
  mod_sqlinclude
  mod_auth_imap
  webalizer
  Apache + SSL
  auth_ldap
  Настройка AWStats
  apache 2.0
  mod_auth_external
  CMS - TYPO3
  phpBB-2/3
  mod_ntlm
  mod_ntlm2
  Nginx+php+fcgi
  OTRS на Apache1
  OTRS на Apache20
  ApacheStats
  mod_evasive
  Lighttpd
  nginx+php-fpm+mysql
  php + mssql
  MySQL + кодировки
  svn+apache+trac
  php5-oci8
  Lighttpd + Apache
  CMS Drupal 6.9
  Apache22+MySQL
  Оптимизация хоста для CMS
  блокировка spam на www
  PostgreSQL 8
  Apache 22 + PHP5 + suPHP
  lighttpd + mod_uploadprogress
  VirtualBox + phpVirtualBox
  DNS API
  Security
  system
  Games Servers
  X11
  Programming
Очумелые Ручки
OpenBSD
Cisco


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?


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2014-07-27, lissyara
gmirror

Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
2013-08-20, zentarim
Scan+Print server FreeBSD 9

Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
2011-11-20, BlackCat
Разъём на WiFi-карту

Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
2011-09-14, manefesto
Настройка git+gitosis

Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 47 чел.
За последние 30 мин было: 184 человек
За сегодня было
2790 показов,
692 уникальных IP
 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0588 секунд
Из них PHP: 40%; SQL: 60%; Число SQL-запросов: 77 шт.
Исходный размер: 112798; Сжатая: 19529