Frage Verwenden Sie Variablen in Apache-Konfigurationsdateien, um die Duplizierung zu reduzieren?


Ist es möglich, Variablen in Apache-Konfigurationsdateien zu verwenden?

Wenn ich beispielsweise eine Site mit Django + WSGI einrichte, könnte die Konfigurationsdatei wie folgt aussehen:

<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

Und ich möchte das '/ path / to / foo' in eine Variable verwandeln, so dass es nur an einer Stelle definiert werden muss. So etwas wie:

Variable FOO /path/to/foo
…

Vielen Dank!


60
2017-09-11 20:33


Ursprung




Antworten:


Du könntest benutzen mod_macro, die seit Apache in httpd enthalten ist Version 2.4 

Vorher musste es separat installiert werden, siehe mod_macro. Zum Beispiel auf Debian: apt-get install libapache2-mod-macro; a2enmod macro.

Beispielkonfiguration

/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

61
2017-09-12 07:12



Ah, das sieht aus wie ich brauche. Schade, dass es nicht eingebaut ist ... Aber ich denke, ich kann leben. Vielen Dank! - David Wolever
Ausgezeichnet! Das macht, was ich geplant hatte, viel besser, als ich dachte, wäre möglich. - SpoonMeiser
@SpoonMeiser Dieses Modul ist ab Version 2.4.6 in Apache HTTP Server integriert. httpd.apache.org/docs/current/mod/mod_macro.html - Ludwig


Viel einfacher zu verwenden Define Stichwort. Sehen Richtlinie definieren.

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

19
2018-06-01 01:47



Ausgezeichnet. Das funktioniert ganz gut. - David Tonhofer


Sie können Konfigurationsbits mit aktivieren oder deaktivieren IfDefinieren aber das wird wahrscheinlich nicht tun, was du willst. Stattdessen können Sie in Ihrem Apache-Initialisierungsskript Umgebungsvariablen festlegen, auf die innerhalb der Konfiguration zugegriffen werden soll. Zum Beispiel hinzufügen:

HOSTNAME=$(hostname)

zu /etc/init.d/httpd (vor der Zeile, die anruft httpd!) auf einem RHEL-Rechner übergibt den Hostnamen des Rechners als Variable. Es muss nicht die Ausgabe eines Befehls sein - irgendetwas, das eine Variable in der startenden Umgebung setzt httpd ist gut. Variablen können in der Konfiguration wie folgt verwendet werden:

[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

Natürlich sind Sie nicht auf die beschränkt Header Richtlinie. Die Variablen können überall verwendet werden, wie <Directory ${FOO}> usw.

Wenn Sie das nicht mögen (und es ist nicht so schön ...), können Sie eine Konfiguration aus einer Vorlage mit erstellen m4 oder eine andere Vorlagensprache.

ZUSÄTZLICH:

Hrm, eine Möglichkeit, es besser zu machen, wäre vielleicht, alle Variablen in einer externen Datei zu speichern /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

und dann diese in deinen Apache aufnehmen init.d Skript mit:

. /etc/httpd/conf/variables

bevor Sie anrufen httpd. Immer noch nicht brillant, aber zumindest trennt es das Startscript und die Variablen.


14
2017-09-11 20:54



hhmm ... Danke - während, wie du sagst, dies nicht ist ziemlich So schön wie ich es mir erhofft habe, es ist sicherlich besser als nichts. Vielen Dank. - David Wolever
Ein besserer (und saubererer) Platz für diese Umgebungsvariablen wäre /etc/sysconfig/httpd (RedHat, CentOS) oder /etc/apache2/envvars (Ubuntu / Debian). Einige Umgebungsvariablen sind bereits vorhanden. - Stefan Lasiewski


Sie können Systemumgebungsvariablen mit mod_env und der PassEnv-Direktive verwenden. Siehe hier

Beispiel für Debian:

Fügen Sie Ihre Variable zu / etc / apache2 / envvars hinzu (diese Datei wird von apache2ctl zum Definieren von Variablen verwendet)

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

Übergeben Sie Ihre Variable in Apache-Konfiguration

PassEnv HOSTNAME

Sie können dann auf die Systemumgebungsvariable zugreifen, als wäre es eine Apache-Variable.

Header set Served-By %{HOSTNAME}e

7
2017-11-10 10:05



vielen Dank - obwohl dies auf apache 2.2 centos 6.4 nicht die Antwort für mich lieferte - es hat mich doch in die richtige Richtung gewiesen +1 - danday74
Dies erfordert mod_define, das standardmäßig nicht in apache2.2 geladen ist. - Thomas


Ich hatte das gleiche Problem und nach einiger Recherche die Lösung für Apache 2.x, die genau löste es für mich (und nichts mehr) war das:

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

Passen Sie auf, dass Sie es nach dem Entpacken so aufbauen sollten (der Installationsteil der Dokumente scheint vergessen zu haben, sich an apache2 zu halten?):

apxs2 -cia mod_define.c

Dann erstellen /etc/apache2/mods-available/define.load:

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

Aktivieren Sie danach das Modul mit a2enmod wie du normalerweise würdest.

Die Dokumente im obigen Link zeigen, wie man es benutzt. Jetzt können Sie sehr einfach Dinge definieren und direkt in der gleichen apache2 config verwenden.


3
2018-01-24 16:39



Falls dies nicht klar ist, ist diese exakt gleiche Funktionalität in Apache 2.4 standardmäßig verfügbar. - ColinM


unglaublich, aber auf httpd 2.2 auf Centos 6.4 funktioniert das

export env vars in / etc / sysconfig / httpd

export mydocroot=/var/www/html

dann mach das einfach ...

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

dann endlich ....

service httpd restart;

2
2018-04-14 14:25





Vielleicht möchten Sie sich das ansehen mod_passenger für Apache, die auch Django-Apps hosten können. Wir benutzen es mit großem Erfolg. Alles, was Sie im vhost tun müssen, ist, hmm, genau nichts. Sie müssen lediglich ein "öffentliches" Verzeichnis im Stammverzeichnis der Anwendung erstellen und Symlinks in "public" zu Ihren statischen Verzeichnissen wie "media" erstellen (dadurch wird die statische Serving-Leistung gesteigert) und verweisen Sie Ihr DocumentRoot darauf.

Platziere dann die folgende Datei in "public /../ passagier_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()

Starten Sie Ihren Browser: Es funktioniert!


1
2017-09-11 22:03



Ah, das ist gut zu wissen - danke. - David Wolever