web-dev-qa-db-fra.com

Vous utilisez des variables dans les fichiers de configuration Apache pour réduire la duplication?

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 je voudrais transformer le '/ path/to/foo' en une variable pour qu'il ne doive être défini qu'à un seul endroit. Quelque chose comme:

Variable FOO /path/to/foo
…

Merci!

70
David Wolever

Vous pouvez utiliser mod_macro , qui est inclus 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
67
Graham Dumpleton

Beaucoup plus simple en utilisant le mot clé Define. 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
28
Mathieu J.

Vous pouvez activer ou désactiver des 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 d'initialisation Apache pour accéder à l'intérieur de la configuration. Par exemple, en ajoutant:

HOSTNAME=$(hostname)

à /etc/init.d/httpd (avant la ligne qui appelle httpd!) sur une machine RHEL transmet le nom d'hôte de la machine sous forme de 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 très bien. Les variables peuvent être utilisées dans la configuration comme ceci:

[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é à 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 en utilisant m4 ou un autre langage de modèle.

[~ # ~] supplémentaire [~ # ~] :

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

puis les inclure dans votre Apache init.d script avec:

. /etc/httpd/conf/variables

avant d'appeler httpd. Toujours pas génial mais au moins ça sépare le script de démarrage et les variables.

14
markdrayton

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

Exemple pour debian:

Ajoutez votre variable dans/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 Apache

PassEnv HOSTNAME

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

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

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

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

Attention, après le déballage, vous devez le construire comme ça (la partie installation des documents semble avoir oublié d'adhérer à Apache2?):

apxs2 -cia mod_define.c

Créez ensuite /etc/Apache2/mods-available/define.load:

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

Après cela, activez le module à l'aide de a2enmod comme vous le feriez normalement.

Les documents du lien ci-dessus montrent comment l'utiliser. Vous pouvez maintenant définir très simplement des éléments et les utiliser directement, le tout dans la même configuration Apache2.

3
Geradeausanwalt

incroyable mais sur httpd 2.2 sur centos 6.4 cela fonctionne

exporter les vars env dans/etc/sysconfig/httpd

export mydocroot=/var/www/html

faites simplement ceci ...

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

enfin ....

service httpd restart;
2
danday74

Vous voudrez peut-être examiner 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" à la racine de l'application et de créer des liens symboliques dans "public" vers vos répertoires statiques comme "media" (cela augmentera les performances du service statique) et de pointer votre DocumentRoot vers celui-ci.

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()

Lancez votre navigateur: cela fonctionne!

1
hurikhan77