Project

General

Profile

Docs ModMySQLVhost » History » Revision 16

Revision 15 (Anonymous, 2008-01-29 11:39) → Revision 16/22 (Anonymous, 2008-09-03 12:08)

[[TracNav(DocsToc)]] 
 {{{ 
 #!rst 
 ==================== 
 MySQL-based vhosting 
 ==================== 

 ----------------------- 
 Module: mod_mysql_vhost 
 ----------------------- 

 .. meta:: 
   :keywords: lighttpd, mysql, vhost 

 .. contents:: Table of Contents 

 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.hostname 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/'); 

 }}} 

 == Wildcard subdomains simple == 
 I had a problem, i have webhosts with wildcard subdomains like *.example.com, and i have the files in the same directory. I wanted to have the same functionality like spamassassin has in the SQL config, so a domain name in the SQL like '%.example.com' works. Here's the query that solves this problem: 
 {{{ 
   mysql-vhost.sql              = "SELECT docroot FROM domains WHERE '?' like domain;" 
 }}} 


 == 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"] == "<DOMAIN_FROM_DATABASE>" { 
 <CONFIG_FROM_DATABASE> 
 } 
 }}} 

 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.