使用 Apache 配置文件中的变量来减少重复?

Dav*_*ver 74 apache-2.2

是否可以在 Apache 配置文件中使用变量?

例如,当我使用 Django+WSGI 设置站点时,配置文件可能如下所示:

<Directory /path/to/foo/>
    Order allow,deny
    Allow from all
</Directory>
Alias /foo/static /path/to/foo/static
WSGIScriptAlias /foo /path/to/foo/run_wsgi
Run Code Online (Sandbox Code Playgroud)

而且我想将 '/path/to/foo' 变成一个变量,所以它只需要在一个地方定义。就像是:

Variable FOO /path/to/foo
…
Run Code Online (Sandbox Code Playgroud)

谢谢!

Gra*_*ton 70

您可以使用mod_macro,它自2.4 版以来已包含在 Apache httpd 中

在此之前,它必须单独安装,请参阅mod_macro。例如在Debian: apt-get install libapache2-mod-macro; a2enmod macro

示例配置

/etc/apache2/conf.d/vhost.macro

<Macro VHost $host $port>
  <VirtualHost $host:$port>

    ServerName $host
    DocumentRoot /var/vhosts/$host

    <Directory /var/vhosts/$host>
      # do something here...
    </Directory>
  </VirtualHost>
</Macro>
Run Code Online (Sandbox Code Playgroud)

/etc/apache2/sites-available/vhost.mysite.com

Use VHost vhost.mysite.com 80
Run Code Online (Sandbox Code Playgroud)

  • @SpoonMeiser 该模块从 2.4.6 版开始集成到 Apache HTTP Server 中。http://httpd.apache.org/docs/current/mod/mod_macro.html (5认同)

小智 31

使用Define关键字更简单。请参阅定义指令

Define RVM_ROOT /opt/rvmdir/gems
Define RUBY_18 ruby-1.8.7-head
Run Code Online (Sandbox Code Playgroud)

...

SetEnv GEM_HOME ${RVM_ROOT}/${RUBY_18}@typo55
SetEnv GEM_PATH ${RVM_ROOT}/${RUBY_18}@typo55:${RVM_ROOT}/${RUBY_18}@global
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`该变量始终是全局定义的,不限于周围配置部分的范围。` 这可能意味着(我暂时没有测试),如果您有多个虚拟主机,则不能使用相同的每个变量(具有不同的值)。 (2认同)

mar*_*ton 14

您可以使用IfDefine启用或禁用一些配置,但这可能不会满足您的需求。相反,您可以在 Apache init 脚本中设置环境变量以在配置中访问。例如,添加:

HOSTNAME=$(hostname)
Run Code Online (Sandbox Code Playgroud)

RHEL 机器上的to /etc/init.d/httpd(在调用httpd!的行之前)将机器的主机名作为变量传入。它不必是命令的输出——任何在启动的环境中设置变量的东西httpd都可以。可以在配置中使用变量,如下所示:

[root@dev ~]# cat /etc/httpd/conf.d/test.conf
Header set X-Hostname ${HOSTNAME}

[root@dev ~]# GET -Sed http://localhost
GET http://localhost --> 200 OK
Connection: close
Date: Fri, 11 Sep 2009 20:47:13 GMT
Server: Apache/2.2.3 (Red Hat)
Content-Length: 525
Content-Type: text/html;charset=ISO-8859-1
Client-Date: Fri, 11 Sep 2009 20:47:13 GMT
Client-Peer: 127.0.0.1:80
Client-Response-Num: 1
Title: Index of /
X-Hostname: dev.local
Run Code Online (Sandbox Code Playgroud)

当然,您并不仅限于该Header指令。变量可以在任何地方使用,例如<Directory ${FOO}>等。

如果您不喜欢这个(而且它不是那么好..),您可以使用m4或其他一些模板语言从模板生成配置。

附加

Hrm,一种更好的方法是将所有变量存储在一个外部文件中,也许/etc/httpd/conf/variables.txt

FOO=/path/to/dir
ROLE=development
Run Code Online (Sandbox Code Playgroud)

然后将这些包含到您的 Apacheinit.d脚本中:

. /etc/httpd/conf/variables
Run Code Online (Sandbox Code Playgroud)

在打电话之前httpd。仍然不是很出色,但至少它将启动脚本和变量分开了。

  • 这些环境变量更好(更干净)的地方是`/etc/sysconfig/httpd`(RedHat、CentOS)或`/etc/apache2/envvars`(Ubuntu/Debian)。一些环境变量已经存在。 (11认同)

Had*_*ien 8

您可以将系统环境变量与 mod_env 和 PassEnv 指令一起使用。 看这里

Debian 示例:

将您的变量添加到 /etc/apache2/envvars (apache2ctl 使用此文件来定义变量)

...
export APACHE_PID_FILE=/var/run/apache2.pid
export HOSTNAME=$(hostname)
Run Code Online (Sandbox Code Playgroud)

将您的变量传递给 apache 配置

PassEnv HOSTNAME
Run Code Online (Sandbox Code Playgroud)

然后,您可以像访问 apache 变量一样访问系统环境变量。

Header set Served-By %{HOSTNAME}e
Run Code Online (Sandbox Code Playgroud)