在Lighttpd(Debian Squeeze)上创建基于MySQL的高级虚拟主机
本指南介绍如何在存储在MySQL数据库中的Debian Squeeze上的lighttpd Web服务器上创建高级虚拟主机。 这里描述的方法不使用lighttpd mod_mysql_vhost模块,而不像mod_mysql_vhost(它允许您仅将主机名和文件根目录存储在数据库中),该方法允许为MySQL数据库中的每个虚拟机存储单个配置指令。
我不会保证这将为您工作!
1安装MySQL 5
首先我们像这样安装MySQL 5:
apt-get install mysql-server mysql-client
您将被要求为MySQL root用户提供密码 - 此密码对用户root @ localhost
以及root@server1.example.com有效
,因此我们不必在以后手动指定MySQL根密码:
MySQL“root”用户的新密码:
< - yourrootsqlpassword
重复MySQL“root”用户的密码:
< - yourrootsqlpassword
2安装Lighttpd,Python和python-mysqldb
我们将使用Python脚本从MySQL数据库中读取vhost配置,因此除了lighttpd之外,我们还必须安装Python和python-mysqldb。
您可以按以下方式安装这些软件包:
apt-get install lighttpd python python-mysqldb
3准备MySQL数据库
现在我们登录到MySQL ...
mysql -u root -p
...并创建数据库lighttpd
:
CREATE DATABASE lighttpd;
接下来,我们使用lighttpd
数据库的SELECT
权限创建一个数据库用户(我们名为lighttpd
):
GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'secret';
GRANT SELECT ON lighttpd.* TO lighttpd@localhost.localdomain IDENTIFIED BY 'secret';
FLUSH PRIVILEGES;
(用您选择的密码替换密码。)
然后我们在lighttpd
数据库中创建域
表,并离开MySQL:
USE lighttpd;
CREATE TABLE IF NOT EXISTS domains (
domain varchar(64) NOT NULL PRIMARY KEY,
docroot varchar(128) NOT NULL,
config text
);
quit;
4创建Python脚本从数据库读取Vhost配置
现在我们创建Python脚本/usr/share/lighttpd/mysql_vhost.py
,它将连接到lighttpd
数据库,并从中读取vhost配置:
vi /usr/share/lighttpd/mysql_vhost.py
#!/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]) |
使脚本可执行:
chmod 755 /usr/share/lighttpd/mysql_vhost.py
现在我们必须告诉lighttpd使用该脚本。 因此,我们打开/etc/lighttpd/lighttpd.conf
并在其末尾添加以下行:
vi /etc/lighttpd/lighttpd.conf
[...] include_shell "/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret" |
(第一个lighttpd
是指MySQL数据库的名称,第二个lighttpd
到数据库用户,并且密码
为MySQL密码。)
以后重启lighttpd:
/etc/init.d/lighttpd restart
5配置虚拟主机
我现在将配置两个虚拟主机,一个用于www.example.com
(文档根目录为/var/www/www.example.com/web
),另一个用于www.example.org
(文件根/ var / www /www.example.org/web
)。
我将添加自定义指令给两个vhosts。 对于www.example.com
vhost,我将启用目录列表,并创建指向文档根/var/www/www.example.com/web
的别名测试
,对于www.example.org
vhost,我将禁用目录列表。
首先,我们创建两个网站的文档根(如果它们不存在):
mkdir -p /var/www/www.example.com/web
mkdir -p /var/www/www.example.org/web
然后我们登录到MySQL ...
mysql -u root -p
USE lighttpd;
...并创建vhosts如下:
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
)。
我们现在可以离开MySQL shell:
quit;
就是这样,vhosts现在配置好了。 要检查我们的/usr/share/lighttpd/mysql_vhost.py
脚本是否按预期工作,我们可以在命令行中调用它...
/usr/share/lighttpd/mysql_vhost.py lighttpd lighttpd secret
...应该显示正确的vhost配置:
root@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"
}
root@server1:~#
与mod_mysql_vhost方式不同,只要vhost配置发生变化,该方法就需要重启lighttpd,所以我们重新启动lighttpd:
/etc/init.d/lighttpd restart
6测试
现在我们来测试一下我们的MySQL的vhosts www.example.com
和www.example.org
是否按预期工作。 我假设你在每个文档根目录中都没有索引文件。
让我们在浏览器中打电话给http://www.example.com
(我们启用了目录列表),你应该看到一个目录列表:
现在,我们来http://www.example.com/test
(在该vhost中没有目录测试
),它应该返回到文档根目录,因为我们已经配置了www.example.com
vhost的别名:
现在去http://www.example.org
,你应该得到一个404 - 未找到
错误(除非文档根目录中有一个索引文件),因为我们已经禁用该vhost的目录列表:
现在让我们试试http://www.example.org/test
- 因为这个目录不存在,我们还没有在www.example.com
vhost中定义这样一个别名,我们得到一个404 -
再次找不到
:
所以一切都按预期工作。
7链接
- Lighttpd: http : //www.lighttpd.net/
- Debian: http : //www.debian.org/