我们将 VirtualHost 条目存储在站点 SVN 存储库内的 (dev|staging|live).conf 文件中。
例如:
/var/www/vhosts/site1.com/live.conf
/var/www/vhosts/site2.com/live.conf
能够自动包含它们会很方便,例如:包含 /var/www/vhosts/*/live.conf
但这似乎不起作用。
我们用一个简单的 PHP 脚本解决了这个问题:
$vhosts = '';
foreach (glob('/var/www/vhosts/*/vhost/dev.conf') as $filename) {
$vhosts .= "\nInclude $filename";
}
file_put_contents('/var/www/vhosts/vhosts.conf', $vhosts);
不过,我希望简化并让 Apache (2.2.3) 来完成这项工作,而不需要 PHP 步骤。
可能的?
答案1
apache2 不支持在包含中使用通配符。不过,你可以按照以下方式稍微安排一下:
- 为您的配置创建一些目录(例如 /etc/apache2/myconfigs)
- 将您的配置动态符号链接到 apache2:
rm -f /etc/apache2/myconfigs/* for i in $(find /var/www/vhosts/*/live.conf); do \ tempfn=$(echo $i|cut -d/ -f5-6|sed s,/,_,); \ ln -s $i /etc/apache2/myconfigs/$tempfn.conf \ done
- 在 apache2.conf 中添加“Include /etc/apache2/myconfigs”
注意:在 cut 上,我使用 -f5-6 进行分隔符连接(以提供类似 site1.com_live.conf 符号链接名称),但您可能需要根据自己的 fs 路径进行调整。注意:以上适用于狂欢,可能需要适应其他 shell。
答案2
我已经测试过,检查语法时出现以下错误:
httpd:/etc/httpd/conf/httpd.conf 第 211 行语法错误:包含 /etc/httpd/*/pr.conf 中不允许使用通配符模式
根据文档,从 2.0.41 版本开始,它支持遵循 shell 样式的通配符匹配 (fnmatch())。但它似乎仅适用于文件 (或路径中的最后一个组件),而不适用于目录。
用python测试,返回true:
In [1]: import fnmatch
In [2]: fnmatch.fn
fnmatch.fnmatch fnmatch.fnmatchcase
In [2]: fnmatch.fnmatch('/etc/httpd/site1.com/live.conf','/etc/httpd/*/live.conf')
Out[2]: True
答案3
mod_perl
允许以下构造:
<Perl>
foreach $file (glob '/etc/httpd/conf.d/vhosts/*/live.conf') {
push @Include, $file;
}
</Perl>
这可以代替Include
指令。
答案4
我已经遇到这个问题一段时间了,并写了一篇博客文章,介绍如何通过对 Apache 应用一些补丁来修复它,希望它能有所帮助。这对我有用 :)
http://wes.limethinking.co.uk/2011/09/07/apache-include-directive-wildcards-in-directory-names/