Виртуальные хосты на lighttpd с хранением конфигурации в MySQL

Статья посвящена настройке виртуальных хостов для lighttpd, работающего под управлением Debian, с хранением всех конфигурационных данных в MySQL. Главная особенность в том, что мы не будем использовать модуль для Лайти mod_mysql_vhost, который позволяет хранить в базе лишь имя хоста и его корневой раздел. Наша конфигурация более гибкая и позволяет хранить в БД все директивы для каждого виртуального хоста

Установка MySQL 5.0
Устанавливаем MySQL:

apt-get install mysql-server mysql-client

Задаем пароль для пользователя root (замените yourrootsqlpassword на ваш пароль)

mysqladmin -u root password yourrootsqlpassword

Проверим, какие адреса слушает MySQL, при помощи команды

netstat -tap | grep mysql

Вывод должен быть примерно таким:

tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     2713/mysqld

Это значит, что MySQL слушает только localhost.localdomain и вы установили пароль. Если же вывод похож на:

tcp        0      0 *:mysql *:*                     LISTEN     2713/mysqld

вам необходимо также установить пароль для вашего хоста (в нашем примере это server1.example.com), иначе кто-угодно сможет подключиться к БД и манипулировать данными

mysqladmin -h server1.example.com -u root password yourrootsqlpassword

Устанавливаем Lighttpd, Python и python-mysqldb
Мы будем использовать скрипт, написанный на Python, для чтения конфигурации из БД. Устанавливаем все необходимое:

apt-get install lighttpd python python-mysqldb

Подготовка базы данных
Подключаемся к MySQL:

mysql -u root -p

создаем базу данных и пользователя. А также даем пользователю привилегии SELECT для запросов к нашей базе

CREATE DATABASE lighttpd;
GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'secret';
GRANT SELECT ON lighttpd.* TO lighttpd@localhost.localdomain IDENTIFIED BY 'secret';
FLUSH PRIVILEGES;

Не забудьте заменить “secret” на реальный пароль
Осталось создать таблицу для наших виртуальных хостов и подготовка БД на этом закончена

USE lighttpd;
CREATE TABLE IF NOT EXISTS domains (
domain varchar(64) NOT NULL PRIMARY KEY,
docroot varchar(128) NOT NULL,
config text
);
quit;

Сценарий для получения данных из БД
Создаем скрипт на python, который будет читать из БД конфигурацию виртуальных хостов

#!/usr/bin/env python
import sys
import MySQLdb

# load configuration data from the database
db=MySQLdb.connect(host='localhost', db=sys.argv[1], user=sys.argv[2], passwd=sys.argv[3])
cur = db.cursor()
cur.execute("SELECT * FROM domains")
rs=cur.fetchall()
db.close()

for domain in rs:

    print "$HTTP[\"host\"] == \"%s\" {\nserver.document-root = \"%s\"\n%s\n}" % (domain[0], domain[1], domain[2])

и сохраняем его в /usr/share/lighttpd/mysql_vhost.py
Делаем скрипт исполняемым

chmod 755 /usr/share/lighttpd/mysql_vhost.py

Теперь надо настроить Лайти для использования нашего срипта. Для этого открываем конфиг /etc/lighttpd/lighttpd.conf и добавляем в конец следующую строчку

[...]
include_shell "/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret"

(первый параметр – это имя БД, второй – имя пользователя БД, третий – пароль для доступа к БД)
После всех изменений перезапустим lighttpd

/etc/init.d/lighttpd restart

Настройка виртуальных хостов
В примере мы настроим два виртуальных хоста: www.example.com (с корневым разделом в /var/www/www.example.com/web) и www.example.org (с корневым разделом в /var/www/www.example.org/web). Мы будем использовать различные параметры для каждого хоста для демонстрации возможностей :)
Для www.example.com мы разрешим листинг директорий и создадим алиас test, который будет указывать на DocumentRoot. Для
www.example.org
листинг директорий будет отключен.

Если корневые разделы еще не существуют, то создадим их:

mkdir -p /var/www/www.example.com/web
mkdir -p /var/www/www.example.org/web

Подключаемся к MySQL и добавим описание наших хостов

INSERT INTO domains VALUES ('www.example.com','/var/www/www.example.com/web/','dir-listing.activate = "enable"\nalias.url = ( "/test" => "/var/www/www.example.com/web" )');
INSERT INTO domains VALUES ('www.example.org','/var/www/www.example.org/web/','dir-listing.activate = "disable"');

Обратите внимание на первый запрос INSERT. Если вы хотите использовать более одной директивы, то поместите между ними управляющий символ “\n”
Все, виртуальные хосты настроены. Для проверки корректности работы нашего скрипта, запустим его из командной строки:

/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret

В выводе должна содержаться корректная информация о наших хостах:

server1:~# /usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret
$HTTP["host"] == "www.example.com" {
server.document-root = "/var/www/www.example.com/web/"
dir-listing.activate = "enable"
alias.url = ( "/test" => "/var/www/www.example.com/web" )
}
$HTTP["host"] == "www.example.org" {
server.document-root = "/var/www/www.example.org/web/"
dir-listing.activate = "disable"
}
server1:~#

В отличие от mod_mysql_vhost, наш способ требует перезапуска сервера

/etc/init.d/lighttpd restart

Тестируем
Пришло время проверить, верно ли работают наши виртуальные хосты. В корневых директориях хостов нет индексных файлов
http://www.example.com (листинг директорий включен)
11.png

http://www.example.com/test Директории test не существует, но мы прописали алиас для этого пути. Поэтому мы видим содержимое DocumentRoot
21.png

http://www.example.org Мы получаем ошибку 404, потому что индексного файла нет, а листинг директорий отключен
31.png

http://www.example.org/test Листинг директорий отключен, и мы не делали алиасов для этого хоста. Поэтому все та же ошибка 404
4.png

Оригинал: http://howtoforge.org/creating-advanced-mysql-based-vhosts-on-lighttpd-debian-etch

Система Orphus

 


 

Comments: 1

  1. Амир July 19th, 2009 at 6:09 pm

    Спасибо за статью!

    всё вроде работает,
    и виртуальный хост по адресу http://example.com (допустим) работает.
    Но как добавить алиас www, так и не понял.

    Для корневого сайта он есть по умолчанию,
    а для добавленных виртуальных хостов,не могу понять,как добавить алиас в базу.

    пробывал:

    CREATE TABLE IF NOT EXISTS `prefix_domains` (
    `domain` varchar(64) collate utf8_unicode_ci NOT NULL,
    `docroot` varchar(128) collate utf8_unicode_ci NOT NULL,
    `config` text collate utf8_unicode_ci,
    `accid` int(11) NOT NULL,
    PRIMARY KEY (`domain`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

    INSERT INTO `prefix_domains` (`domain`, `docroot`, `config`, `accid`) VALUES
    (‘example.com’, ‘/home/www/example.com/’, ‘dir-listing.activate = “disable”\r\nalias.url = ( “www.example.com” => “/home/www/example.com/” )\r\ninclude “conf-available/mymtype”\r\ncompress.cache-dir = “/home/www/cache/example.com/”‘, 1);
    но ничего не выходит.

    подскажите пожалуйста.
    А то в официальной документации,приводятся примеры алиасов,но мне они не подходят.
    Сейчас приходится по 2 хоста добавлять,
    example.com и http://www.example.com с одной директорией

    а хочется обойтись алиасом.

Add a Comment