84 votes

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 d'Apache ?

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

<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 '/path/to/foo' en une variable afin qu'elle ne doive être définie qu'à un seul endroit. Quelque chose comme :

Variable FOO /path/to/foo
…

Gracias.

77voto

Jason Points 8799

Vous pourriez utiliser mod_macro qui a été incluse dans Apache httpd depuis version 2.4

Avant cela, il devait être installé séparément, voir mod_macro . Par exemple sur Debian : 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

38voto

Mathieu J. Points 442

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

15voto

MojoFilter Points 3730

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

HOSTNAME=$(hostname)

à /etc/init.d/httpd (avant la ligne qui appelle httpd !) sur une machine RHEL passe le nom d'hôte de la machine en tant que variable. Il n'est pas nécessaire qu'il s'agisse de la sortie d'une commande -- tout ce qui définit une variable dans l'environnement qui permet de lancer la commande 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 limité à l' Header directive. 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 à l'aide de la fonction 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 les inclure dans votre Apache init.d script avec :

. /etc/httpd/conf/variables

avant d'appeler httpd . Ce n'est toujours pas brillant mais au moins cela sépare le script de démarrage et les variables.

9voto

Jared Bienz - MSFT Points 2866

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

Exemple pour debian :

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

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

Passez votre variable dans la configuration 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

3voto

Geradeausanwalt Points 141

J'ai eu le même problème et, après quelques recherches, la solution pour Apache 2.x que exactement

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

Attention, après le déballage, vous devez le compiler comme ceci (la partie install de la documentation semble 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

Après cela, activez le module en utilisant a2enmod comme vous le feriez normalement.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X