在Apacheconfiguration文件中使用variables来减less重复?

有没有可能在Apacheconfiguration文件中使用variables?

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

<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'变成一个variables,所以只需要在一个地方定义。 就像是:

 Variable FOO /path/to/foo … 

谢谢!

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

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

    示例configuration

    /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 

    您可以使用IfDefine启用或禁用一些configuration,但可能无法达到您想要的效果。 相反,您可以在您的Apache初始化脚本中设置环境variables,以便在configuration中进行访问。 例如,添加:

     HOSTNAME=$(hostname) 

    到RHEL机器上的/etc/init.d/httpd (在调用httpd !的行之前)将该机器的主机名作为variables传递。 它不一定是一个命令的输出 – 在启动httpd的环境中设置variables的任何东西都可以。 variables可以在configuration中使用,如下所示:

     [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 

    当然,你并不局限于Header指令。 variables可以在任何地方使用,如<Directory ${FOO}>等。

    如果你不喜欢这个(也不是那么好),你可以使用m4或其他模板语言从模板生成一个configuration。

    附加

    Hrm,使其更好的一种方法是将所有variables存储在外部文件中,可能是/etc/httpd/conf/variables.txt

     FOO=/path/to/dir ROLE=development 

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

     . /etc/httpd/conf/variables 

    在调用httpd之前。 仍然没有辉煌,但至less它分开启动脚本和variables。

    使用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 

    您可以使用mod_env和PassEnv指令使用系统环境variables。 看这里

    debian示例:

    将你的variables添加到/ etc / apache2 / envvars(这个文件被apache2ctl用来定义variables)

     ... export APACHE_PID_FILE=/var/run/apache2.pid export HOSTNAME=$(hostname) 

    将你的variables传递给apacheconfiguration

     PassEnv HOSTNAME 

    然后你可以像访问apachevariables一样访问系统环境variables。

     Header set Served-By %{HOSTNAME}e 

    我也有同样的问题,经过一番研究,Apache 2.x的解决scheme正是为我解决了这个问题,

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

    请注意,解包之后,您应该像这样构build它(文档的安装部分似乎已经忘记坚持apache2?):

     apxs2 -cia mod_define.c 

    然后创build/etc/apache2/mods-available/define.load

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

    之后, a2enmod使用a2enmod启用模块。

    上面的链接中的文档显示了如何使用它。 现在你可以非常简单地定义一些东西,并直接使用它们,全部在同一个apache2configuration中。

    令人难以置信,但在httpd 2.2上的centos 6.4这个作品

    在/ etc / sysconfig / httpd中导出envvariables

     export mydocroot=/var/www/html 

    那么干脆这样做…

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

    然后终于….

     service httpd restart; 

    你可能想看看mod_passenger的Apache也可以主持Django的应用程序。 我们使用它取得了巨大的成功。 所有你需要做的虚拟主机,嗯,什么都没有。 唯一需要的是在应用程序根目录下创build一个“公共”目录,并在“public”中创build符号链接到静态目录,如“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() 

    启动您的浏览器:它的工作原理!