lunes, 25 de agosto de 2008

MySQL-based vhosting

Module: mod_mysql_vhost

Description

With MySQL-based vhosting you can store the path to a given host's document root in a MySQL database.

Note

Keep in mind that only one vhost module should be active at a time. Don't mix mod_simple_vhost with mod_mysql_vhost.

Options

Example:

mysql-vhost.db             = "lighttpd"
mysql-vhost.user = "lighttpd"
mysql-vhost.pass = "secret"
mysql-vhost.sock = "/var/run/mysqld/mysqld.sock"
mysql-vhost.sql = "SELECT docroot FROM domains WHERE domain='?';"
mysql-vhost.hostname = "localhost"
mysql-vhost.port = 3306

If specified, mysql-vhost.host overrides mysql-vhost.sock.

MySQL setup:

GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'secret';

CREATE DATABASE lighttpd;

USE lighttpd;

CREATE TABLE domains (
domain varchar(64) not null primary key,
docroot varchar(128) not null
);

INSERT INTO domains VALUES ('host.dom.ain','/http/host.dom.ain/');

Per-vhost configuration

I wanted to be able to add configuration directives per vhost. This is how I did it.

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

then I added this line to my mysql-vhost.conf (but you can use lighttpd.conf)

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

the parameters are just the info above. I didn't know how to pass the actual variables (maybe someone else does?) so I just repeated their values.

I then made a script called /usr/share/lighttpd/mysql_vhost.py, which just prints the info. You could write this in perl, php, or bash, if you want.

it should output this format:

$HTTP["host"] == "" {

}

mine looks like this:

#!/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])

Now, you can put whatever directives you want in the config field. Make sure to restart your server to enable the settings, if you change them in the database.

Fuente: trac.lighttpd

No hay comentarios: