有没有可能在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
。
/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()
启动您的浏览器:它的工作原理!