在 Apache 配置中使用变量

在 Apache 配置中使用变量

我的 Apache2 配置中有许多基本相同的配置文件,用于配置各种子域。在大多数配置文件中,只有子域本身的名称与其他文件不同,因此我试图弄清楚是否可以在配置文件的顶部设置某种变量以轻松设置诸如ServerName, DocumentRoot, ErrorLog,CustomLog

有点像(这显然不起作用):

subdomain=blog

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName ${subdomain}.example.com
        DocumentRoot /var/www/${subdomain}.example.com/htdocs

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn
        ErrorLog /var/log/apache2/${subdomain}.example.com_error.log
        CustomLog /var/log/apache2/${subdomain}.example.com_access.log combined

        RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>

一个更聪明的解决方案是,如果subdomain可以通过配置文件的文件名的正则表达式来设置变量。

我确实找到了动态配置的海量虚拟主机,但它并没有准确描述我想要的。

在 Linux 上运行 Apache 2.2。

答案1

Perl 演示Template::Toolkit(无需学习 Perl 即可使用tpage随模块安装的命令):

模板文件:

$ cat vhost.tpl
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName [% subdomain %].example.com
        DocumentRoot /var/www/[% subdomain %].example.com/htdocs

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn
        ErrorLog /var/log/apache2/[% subdomain %].example.com_error.log
        CustomLog /var/log/apache2/[% subdomain %].example.com_access.log combined
</VirtualHost>

配置生成:

$ tpage --define subdomain=domain.tld --interpolate vhost.tpl
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName domain.tld.example.com
        DocumentRoot /var/www/domain.tld.example.com/htdocs

        # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
        LogLevel warn
        ErrorLog /var/log/apache2/domain.tld.example.com_error.log
        CustomLog /var/log/apache2/domain.tld.example.com_access.log combined
</VirtualHost>

答案2

最灵活的选择是使用一些外部程序基于模板创建 Apache 配置。 Unix 上的传统程序是M4,尽管现在可能有些不那么巴洛克风格了。

答案3

过去我使用 mod_macro 来实现你想要做的大部分事情,但现在我使用配置管理(在我的例子中是木偶,但他们中的任何一个都应该能够做到这一点)。然后您可以使用高级脚本语言构建您的配置。

有大量用于 puppet 的参数化 Apache vhost 模块的示例。

所以我想说,如果你已经在使用配置管理或正在考虑使用它,那就这样做,否则看看 mod_macro。

http://people.apache.org/~fabien/mod_macro/

相关内容