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" }
很棒,不是吗?:)