it-swarm.cn

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

是否可以在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

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

Variable FOO /path/to/foo
…

谢谢!

70
David Wolever

您可以使用 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>

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

Use VHost vhost.mysite.com 80
67
Graham Dumpleton

使用Define关键字要简单得多。参见 定义指令

Define RVM_ROOT /opt/rvmdir/gems
Define Ruby_18 Ruby-1.8.7-head

...

SetEnv GEM_HOME ${RVM_ROOT}/${Ruby_18}@typo55
SetEnv GEM_PATH ${RVM_ROOT}/${Ruby_18}@typo55:${RVM_ROOT}/${Ruby_18}@global
28
Mathieu J.

您可以使用 IfDefine 启用或禁用配置位,但这可能无法满足您的要求。相反,您可以在Apache初始化脚本中设置环境变量以在配置中进行访问。例如,添加:

HOSTNAME=$(hostname)

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

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

[[email protected] ~]# 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

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

如果您不喜欢这样(不是很好),您可以使用 m4 或其他某种模板语言从模板生成配置。

[〜#〜]附加[〜#〜]

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

FOO=/path/to/dir
ROLE=development

然后将它们包含到您的Apache init.d脚本,其中:

. /etc/httpd/conf/variables

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

14
markdrayton

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

Debian的示例:

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

...
export Apache_PID_FILE=/var/run/Apache2.pid
export HOSTNAME=$(hostname)

将变量传递到Apache配置

PassEnv HOSTNAME

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

Header set Served-By %{HOSTNAME}e
7
Hadrien

我有同样的问题,经过一些研究,Apache 2.x的解决方案完全为我解决了(仅此而已):

http://people.Apache.org/~rjung/mod_define/

请注意,解压缩后应该像这样进行构建(文档的安装部分似乎忘记了使用Apache2?):

apxs2 -cia mod_define.c

然后创建/etc/Apache2/mods-available/define.load

LoadModule define_module /usr/lib/Apache2/modules/mod_define.so

之后,像通常一样使用a2enmod启用模块。

上方链接中的文档显示了如何使用它。现在,您可以非常简单地定义东西并直接在同一Apache2配置中直接使用它们。

3
Geradeausanwalt

令人难以置信,但在centos 6.4的httpd 2.2上可以正常工作

在/ etc/sysconfig/httpd中导出环境变量

export mydocroot=/var/www/html

然后简单地做到这一点...

<VirtualHost *:80>
  DocumentRoot ${mydocroot}
</VirtualHost>

然后终于....

service httpd restart;
2
danday74

您可能想研究 mod_passenger 来获取Apache,Apache也可以托管Django应用程序。我们非常成功地使用它。在vhost中需要做的就是hmm了) ,完全没有什么,只需要在应用程序根目录中创建一个“ public”目录,并在“ public”中创建指向诸如“ media”之类的静态目录的符号链接(这将提高静态服务性能)并将DocumentRoot指向该目录。

然后将以下文件放在“ public /../ passenger_wsgi.py”中:

import sys, os
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(current_dir)
sys.path.append('/PATH/TO/PACKAGES') # optional
os.environ['Django_SETTINGS_MODULE'] = 'settings'
import Django.core.handlers.wsgi
application = Django.core.handlers.wsgi.WSGIHandler()

启动您的浏览器:它有效!

1
hurikhan77