Utilisation de variables dans les fichiers de configuration Apache pour réduire les doublons?

Est-il possible d'utiliser des variables dans les fichiers de configuration Apache?

Par exemple, lorsque je configure un site avec Django + WSGI, le fichier de configuration peut ressembler à:

<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 

Et j'aimerais transformer le '/ path / to / foo' en une variable, donc il faut qu'elle soit définie en un seul endroit. Quelque chose comme:

 Variable FOO /path/to/foo … 

Merci!

Vous pouvez utiliser mod_macro , inclus dans Apache httpd depuis la version 2.4

Avant cela, il fallait l'installer séparément, voir mod_macro . Par exemple, sur Debian: apt-get install libapache2-mod-macro; a2enmod macro apt-get install libapache2-mod-macro; a2enmod macro .

Exemple de 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 

Vous pouvez activer ou désactiver les bits de configuration avec IfDefine mais cela ne fera probablement pas ce que vous voulez. Au lieu de cela, vous pouvez définir des variables d'environnement dans votre script Apache init pour accéder à la configuration. Par exemple, en ajoutant:

 HOSTNAME=$(hostname) 

À /etc/init.d/httpd (avant que la ligne qui appelle httpd !) Sur une machine RHEL passe le nom d'hôte de la machine en tant que variable. Il ne doit pas nécessairement être la sortie d'une commande – tout ce qui définit une variable dans l'environnement qui lance httpd est bien. Les variables peuvent être utilisées dans la configuration comme suit:

 [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 

Bien sûr, vous n'êtes pas restreint à la directive Header . Les variables peuvent être utilisées n'importe où, comme <Directory ${FOO}> etc.

Si vous n'aimez pas cela (et ce n'est pas si agréable …), vous pouvez générer une configuration à partir d'un modèle utilisant m4 ou un autre langage de modèle.

ADDITIONNEL :

Hrm, une façon de l'améliorer serait de stocker toutes les variables dans un fichier externe, peut-être /etc/httpd/conf/variables.txt :

 FOO=/path/to/dir ROLE=development 

Et ensuite inclure ces dans votre script init.d Apache avec:

 . /etc/httpd/conf/variables 

Avant d'appeler httpd . Toujours pas génial, mais au moins, il sépare le script de démarrage et les variables.

Beaucoup plus simple en utilisant Define mot-clé. Voir Définir la directive .

 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 

Vous pouvez utiliser les variables d'environnement système avec mod_env et la directive PassEnv. Vois ici

Exemple pour debian:

Ajoutez votre variable dans / etc / apache2 / envvars (ce fichier est utilisé par apache2ctl pour définir des variables)

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

Passez votre variable dans config d'apache

 PassEnv HOSTNAME 

Vous pouvez alors accéder à la variable d'environnement système comme s'il s'agissait d'une variable apache.

 Header set Served-By %{HOSTNAME}e 

J'ai eu le même problème et, après quelques recherches, la solution pour Apache 2.x qui l'a exactement résolu (et rien de plus) était la suivante:

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

Faites attention qu'après le déballage, vous devriez le construire de la sorte (la partie d'installation des documents semble-t-elle avoir oublié d'adhérer à apache2?):

 apxs2 -cia mod_define.c 

Ensuite, créez /etc/apache2/mods-available/define.load :

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

Ensuite, activez le module en utilisant a2enmod comme vous le feriez normalement.

Les documents du lien ci-dessus montrent comment l'utiliser. Maintenant, vous pouvez simplement définir des choses et l'utiliser directement, tout cela dans la même configuration apache2.

Vous voudrez peut-être consulter mod_passenger pour apache qui peut également héberger des applications django. Nous l'utilisons avec beaucoup de succès. Tout ce que vous devez faire dans le vhost est, hmm, exactement rien. La seule chose dont vous avez besoin est de créer un répertoire "public" dans la racine de l'application et de créer des liens symboliques dans "public" dans vos répertoires statiques comme "média" (cela stimulera les performances de service statique) et vous indiquera votre DocumentRoot.

Ensuite, placez le fichier suivant dans "public /../ passager_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() 

Éclatez votre navigateur: ça fonctionne!

Incroyable mais sur httpd 2.2 sur centos 6.4 cela fonctionne

Exporter des espaces dans / etc / sysconfig / httpd

 export mydocroot=/var/www/html 

Alors faites simplement ceci …

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

enfin ….

 service httpd restart;