在Lighttpd(Ubuntu 12.04)上创建基于MySQL的高级虚拟主机

在Lighttpd(Ubuntu 12.04)上创建基于MySQL的高级虚拟主机 本指南介绍如何在a上创建高级虚拟主机 光...

在Lighttpd(Ubuntu 12.04)上创建基于MySQL的高级虚拟主机

本指南介绍如何在存储在MySQL数据库中的Ubuntu 12.04上的lighttpd Web服务器上创建高级虚拟主机。 这里描述的方法不使用lighttpd mod_mysql_vhost模块,而不像mod_mysql_vhost(它允许您仅将主机名和文件根目录存储在数据库中),该方法允许为MySQL数据库中的每个虚拟机存储单个配置指令。

我不会保证这将为您工作!

1初步说明

因为我们必须使用root权限运行本教程的所有步骤,所以我们可以使用字符串sudo在本教程中添加所有命令,也可以通过键入来成为root

sudo su

2安装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

3安装Lighttpd,Python和python-mysqldb

我们将使用Python脚本从MySQL数据库中读取vhost配置,因此除了lighttpd之外,我们还必须安装Python和python-mysqldb。

您可以按以下方式安装这些软件包:

apt-get install lighttpd python python-mysqldb

4准备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;

5创建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

6配置虚拟主机

我现在将配置两个虚拟主机,一个用于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

7测试

现在我们来测试一下我们的MySQL的vhosts www.example.comwww.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 -再次找不到

所以一切都按预期工作。