lighttpd基础配置-虚拟主机

guoscy 2009-12-16

继续lighttpd的配置,这次测试的内容就是虚拟主机:

引用
1、常规虚拟主机设定

2、简单虚拟主机mod_simple_vhost

3、复杂虚拟设置匹配 mod_evhost

以下内容,都是在编译/etc/lightpd/lighttpd.conf,保存后,重启lighttpd服务。

一、总体设定

在lighttpd中,设置虚拟主机非常简单,而且不需要加载额外的模块:
引用
$HTTP["host"] == "www.linuxfly.org" {

server.name="www.linuxfly.org"

server.document-root="/var/www/html/linuxfly"

server.errorlog="/var/log/linuxfly-error.log"

accesslog.filename="/var/log/linuxfly-access.log"

}

设置清楚明了,即设定与www.linuxfly.org域名绑定的虚拟主机在/var/www/html/linuxfly目录。

二、简单虚拟主机设定mod_simple_vhost

mod_simple_vhost模块适用于简单虚拟主机,即只有一个域名,但多个子域名的情况。

一个完整的document root由三个值server-root、hostname、document-root决定,组成:
引用
server-root + hostname + document-root

如果路径不存在,会由默认值组成:

引用
server-root + default-host + document-root

举个例子:

引用
server.modules              += ("mod_simple_vhost")

simple-vhost.server-root="/var/www/html/"

simple-vhost.default-host="linuxfly.org"

simple-vhost.document-root="www"

$HTTP["host"]=="news.linuxfly.org"{

server.document-root="/var/www/html/linuxfly.org/news/"

}

一个完整的document root就是以下目录:

引用
/var/www/html + linuxfly.org + www

/var/www/html/linuxfly.org/www

当访问news.linuxfly.org时,若"/var/www/html/linuxfly.org/news/"存在,则其作为虚拟主机主目录;否则,若不存在,则会把"/var/www/html/linuxfly.org/www"作为主目录。

◎注意,上面的simple_vhost设定适用于所有的域名情况,这会带来一个问题。

如果我不止一个域名,例如,在simple_vhost后面还做了下面的设定,结果如何呢?
引用
$HTTP["host"] == "www.linuxfly.cn" {

server.document-root="/var/www/html/linuxfly.cn/www/"

}

结果就是,这个设定会无效。即使路径存在,但你访问www.linuxfly.cn还是会出现500错误。

这时,你可以这样做:
引用
$HTTP["host"] != "www.linuxfly.cn" {

simple-vhost.server-root="/var/www/html/"

simple-vhost.default-host="linuxfly.org"

simple-vhost.document-root="www"

}

这样,simple_vhost对www.linuxfly.cn忽略,所以,适用于两个域名的情况。不过,我还是觉得不好用。

◎另外,mod_simple_vhost在模块加载时,必须比mod_cache和mod_proxy靠前,否则会带来问题。

三、增强虚拟主机设定mod_evhost

simple_vhost适用的情况太单一。但若对每台虚拟主机都需设定一次参数文件,无疑是件很麻烦的事情。mod_evhost就适用于解决多域名、多子域名的情形。其提供一些参数:
引用
# define a pattern for the host url finding

#%%=>%sign

#%0=>domainname+tld

#%1=>tld

#%2=>domainnamewithouttld

#%3=>subdomain1name

# %4 => subdomain 2 name

有这些参数以后,路径的设定就简单了:

引用
server.modules              += ("mod_evhost")

$HTTP["host"]=~"www\.linuxfly"{

evhost.path-pattern="/var/www/html/%0/%3"

}

当访问http://www.linuxfly.org时,虚拟主机根目录(document root)就是:

引用
%0 = linuxfly.org

%3=www

即:

/var/www/html/linuxfly.org/www

既然,lighttpd支持正规表达式,那就可以设置成:

引用
$HTTP["host"] =~ "^(www|www1)\.linuxfly" {

evhost.path-pattern="/var/www/html/%0/%3"

}

这样,其他子域名有以下对应:

引用
www1.linuxfly.org => /var/www/html/linuxfly.org/www1www2.linuxfly.org => /var/www/html/linuxfly.org/www2

可见,用正规格表达式匹配域名,mod_evhost参数代替可变的目录名称,然后动态对应目录路径,可非常方便的处理多虚拟主机的情况。别忘了,还可以用ln-s做目录的软链接哦。

四、其他

充分利用好正规表达式,能简化很多写法:
引用
$HTTP["host"] ~= "^(host\.linuxfly\.org|host\.linuxfly\.cn)$" {......}$HTTP["host"] ~= "(^|\.)linuxfly\.org$" {......}

不过,请注意,$HTTP["host"]变量是匹配http://xxxx/部分。如果lighttpd监控的不是80端口,那访问的应该是:http://xxxx:port/。这时,上面的$号(表示结尾)就会带来麻烦了。

解决方法嘛!?自己想想哦?

相关推荐