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
.
/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;