Vraag Variabelen in Apache-configuratiebestanden gebruiken om duplicatie te verminderen?


Is het mogelijk om variabelen in Apache-configuratiebestanden te gebruiken?

Als ik bijvoorbeeld een site opzet met Django + WSGI, kan het configuratiebestand er als volgt uitzien:

<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

En ik zou de '/ path / to / foo' willen veranderen in een variabele, zodat deze slechts op één plaats hoeft te worden gedefinieerd. Zoiets als:

Variable FOO /path/to/foo
…

Bedankt!


60
2017-09-11 20:33


oorsprong




antwoorden:


Je zou kunnen gebruiken mod_macro, die sindsdien is opgenomen in Apache httpd versie 2.4 

Voordien moest het apart worden geïnstalleerd, zie mod_macro. Bijvoorbeeld op Debian: apt-get install libapache2-mod-macro; a2enmod macro.

Voorbeeldconfiguratie

/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, dat lijkt op wat ik nodig heb. Jammer dat het niet is ingebouwd ... Maar ik denk dat ik kan leven. Bedankt! - David Wolever
Uitstekend! Dit doet wat ik van plan was te doen voor veel beter dan ik dacht dat mogelijk zou zijn om te doen. - SpoonMeiser
@SpoonMeiser Deze module is geïntegreerd in Apache HTTP Server vanaf versie 2.4.6. httpd.apache.org/docs/current/mod/mod_macro.html - Ludwig


Veel eenvoudiger met Define trefwoord. Zien Definieer richtlijn.

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



Uitstekend. Dit werkt perfect. - David Tonhofer


U kunt bits van configuratie in- of uitschakelen met IfDefine maar dat zal waarschijnlijk niet doen wat je wilt. In plaats daarvan kunt u omgevingsvariabelen in uw Apache init-script instellen om toegang te krijgen tot de configuratie. Bijvoorbeeld: toevoegen:

HOSTNAME=$(hostname)

naar /etc/init.d/httpd (vóór de regel die belt httpd!) op een RHEL-machine geeft de hostnaam van de machine door als een variabele. Het hoeft niet de uitvoer van een opdracht te zijn - alles wat een variabele instelt in de omgeving die wordt gestart httpd is goed. Variabelen kunnen als volgt in de configuratie worden gebruikt:

[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

Natuurlijk ben je niet beperkt tot de Header richtlijn. De variabelen kunnen overal worden gebruikt, zoals <Directory ${FOO}> enz.

Als je dit niet leuk vindt (en het is niet zo aardig ..) kun je een configuratie van een sjabloon genereren met m4 of een andere sjabloontaal.

EXTRA:

Hrm, een manier om het beter te maken zou zijn om alle variabelen in een extern bestand op te slaan, misschien /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

en neem deze dan op in je Apache init.d script met:

. /etc/httpd/conf/variables

voor het bellen httpd. Nog steeds niet briljant, maar in ieder geval scheidt het het opstartscript en de variabelen.


14
2017-09-11 20:54



hhmm ... Bedankt - terwijl, zoals je zegt, dit niet is heel zo mooi als ik had gehoopt, het is zeker beter dan niets. Bedankt. - David Wolever
Een betere (en schonere) plaats voor deze omgevingsvariabelen zou zijn /etc/sysconfig/httpd (RedHat, CentOS) of /etc/apache2/envvars (Ubuntu / Debian). Sommige omgevingsvariabelen zijn er al. - Stefan Lasiewski


U kunt systeemomgevingsvariabelen gebruiken met mod_env en de PassEnv-richtlijn. Kijk hier

Voorbeeld voor debian:

Voeg je variabele toe aan / etc / apache2 / envvars (dit bestand wordt gebruikt door apache2ctl om variabelen te definiëren)

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

Geef je variabele door aan apache config

PassEnv HOSTNAME

U kunt dan toegang krijgen tot de systeemomgevingsvariabele alsof het een apache-variabele was.

Header set Served-By %{HOSTNAME}e

7
2017-11-10 10:05



heel erg bedankt - hoewel dit voor mij niet het antwoord was op apache 2.2 centos 6.4 - het wees me in de goede richting +1 - danday74
Dit vereist mod_define, standaard niet geladen in apache2.2. - Thomas


Ik had hetzelfde probleem en na enig onderzoek de oplossing voor Apache 2.x dat precies het voor mij opgelost (en niets meer) was dit:

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

Pas op dat u het na het uitpakken zo moet bouwen (het installatieonderdeel van de documenten lijkt te zijn vergeten zich aan apache2 aan te passen?):

apxs2 -cia mod_define.c

Creëer dan /etc/apache2/mods-available/define.load:

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

Schakel daarna de module in met a2enmod zoals je normaal zou doen.

De documenten in de bovenstaande link laten zien hoe u deze kunt gebruiken. Nu kun je dingen heel eenvoudig definiëren en direct gebruiken, allemaal binnen dezelfde apache2-configuratie.


3
2018-01-24 16:39



Als dit niet duidelijk is, is deze exact dezelfde functionaliteit standaard beschikbaar in Apache 2.4. - ColinM


ongelofelijk maar op httpd 2.2 op centos 6.4 werkt dit

export env vars in / etc / sysconfig / httpd

export mydocroot=/var/www/html

doe dit dan gewoon ...

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

uiteindelijk ....

service httpd restart;

2
2018-04-14 14:25





Misschien wilt u ernaar kijken mod_passenger voor apache die ook django-apps kan hosten. We gebruiken het met groot succes. Alles wat u hoeft te doen in het vizier is, hmm, helemaal niets. Het enige wat je nodig hebt is om een ​​"publieke" map in de root van de applicatie te maken en symlinks in "public" naar je statische mappen zoals "media" te maken (dit zal de statische serverprestaties verbeteren) en je DocumentRoot ernaar verwijzen.

Plaats vervolgens het volgende bestand in "public /../ passenger_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()

Start uw browser op: het werkt!


1
2017-09-11 22:03



ah, dat is goed om over te weten - bedankt. - David Wolever