lighttpd 1.4.0 的一个重要特性是嵌套条件句,但它们如何使用?什么是 include?
嵌套条件句的例子已在公告中提及。
$HTTP["host"] == "www.example.org" {
$HTTP["url"] =~ "^/dav($|/)" {
webdav.activate = "enable"
}
$HTTP["remoteip"] != "10.0.0.0/16" {
auth.require = ( "" => ( "method" => "basic",
"realm" => "webdav",
"require" => "valid-user" ) )
}
}
那么 include 是用来做什么的呢?首先,我们想采用批量托管的方式,并希望为虚拟主机创建一个通用模式,而无需使用 mod_simple_vhost 或类似的模块。
我们有一个简单的 Web 服务器结构
- 所有服务器都在 /var/www/servers/ 下
- 该部分是服务器的主机名
- 日志和公共文件位于 logs/ 和 pages/
最终路径为 /var/www/servers/www.example.org/pages/。
在 lighttpd 1.3.x 中,您必须复制所有主机的条件句,包括所有选项。当时无法对配置文件进行任何解释。
在 lighttpd 1.4.0 中,情况发生了变化,我们可以使用表达式和 includes
server.document-root = "/tmp"
server.port = 1025
server.modules = ( "mod_access" )
access.deny = ( "~", ".inc" )
$HTTP["host"] == "www.example.org" {
var.hostname = "www.example.org"
include "baseconfig.conf"
}
$HTTP["host"] == "www2.example.org" {
var.hostname = "www2.example.org"
include "baseconfig.conf"
}
以及一个 baseconfig.conf
server.document-root = "/var/www/servers/" + hostname + "/pages/" access.logfile = "/var/www/servers/" + hostname + "/logs/accesslog"
通过 var.hostname,您可以在配置中设置一个用户变量,该变量可以在配置中的任何地方使用来传递数据。我们在这里使用它来替换 baseconfig 中每个主机的部分,并为每个主机设置文档根目录和访问日志的位置。
但是 lighttpd 使用的配置是什么样的呢?选项 -p 会告诉我们
$ /lighttpd -p -f ./lighttpd-includes.conf
config {
server.document-root = "/tmp"
server.port = 1025
server.modules = ("mod_indexfile", "mod_access", "mod_dirlisting", "mod_staticfile")
access.deny = ("~", ".inc")
$HTTP["host"] == "www.example.org" {
# block 1
var.hostname = "www.example.org"
server.document-root = "/var/www/servers/www.example.org/pages/"
access.logfile = "/var/www/servers/www.example.org/logs/accesslog"
} # end of $HTTP["host"] == "www.example.org"
$HTTP["host"] == "www2.example.org" {
# block 2
var.hostname = "www2.example.org"
server.document-root = "/var/www/servers/www2.example.org/pages/"
access.logfile = "/var/www/servers/www2.example.org/logs/accesslog"
} # end of $HTTP["host"] == "www2.example.org"
}
很棒,不是吗?:)