सवाल डुप्लिकेशंस को कम करने के लिए अपाचे कॉन्फ़िगरेशन फ़ाइलों में चर का उपयोग करना?


क्या अपाचे कॉन्फ़िगरेशन फ़ाइलों में चर का उपयोग करना संभव है?

उदाहरण के लिए, जब मैं Django + WSGI के साथ एक साइट स्थापित कर रहा हूं, तो कॉन्फ़िगरेशन फ़ाइल इस तरह दिख सकती है:

<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

और मैं '/ path / to / foo' को एक चर में बदलना चाहता हूं, इसलिए इसे केवल एक ही स्थान पर परिभाषित करने की आवश्यकता है। कुछ इस तरह:

Variable FOO /path/to/foo
…

धन्यवाद!


60
2017-09-11 20:33


मूल




जवाब:


आप उपयोग कर सकते हैं mod_macro, जिसे अपाचे httpd में शामिल किया गया है संस्करण 2.4 

इससे पहले इसे अलग से स्थापित किया जाना था, देखें mod_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

61
2017-09-12 07:12



आह, ऐसा लगता है कि मुझे क्या चाहिए। शर्मिंदा यह नहीं बनाया गया है ... लेकिन मुझे लगता है कि मैं जी सकता हूं। धन्यवाद! - David Wolever
अति उत्कृष्ट! यह वही करता है जो मैं करने के लिए योजना बनाने की योजना बना रहा था, जैसा कि मैंने सोचा था कि ऐसा करना संभव होगा। - SpoonMeiser
@SpoonMeiser यह मॉड्यूल संस्करण 2.4.6 से अपाचे HTTP सर्वर में एकीकृत है। httpd.apache.org/docs/current/mod/mod_macro.html - Ludwig


बहुत आसान उपयोग कर रहे हैं Define कीवर्ड। देख निर्देश परिभाषित करें

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



अति उत्कृष्ट। यह पूरी तरह से अच्छी तरह से काम करता है। - David Tonhofer


आप विन्यास के बिट्स को सक्षम या अक्षम कर सकते हैं IfDefine लेकिन शायद वह नहीं करेगा जो आप चाहते हैं। इसके बजाय, आप कॉन्फ़िगरेशन के भीतर पहुंचने के लिए अपने अपाचे इनिट स्क्रिप्ट में पर्यावरण चर सेट कर सकते हैं। उदाहरण के लिए, जोड़ना:

HOSTNAME=$(hostname)

सेवा मेरे /etc/init.d/httpd (कॉल करने वाली रेखा से पहले httpd!) एक आरएचईएल मशीन पर मशीन के होस्टनाम को चर के रूप में पास करता है। इसे कमांड का आउटपुट नहीं होना चाहिए - जो कुछ भी लॉन्च करता है, उसमें एक चर सेट करता है httpd ठीक है। कॉन्फ़िगरेशन में चर का उपयोग किया जा सकता है जैसे:

[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

बेशक, आप तक ही सीमित नहीं हैं Header निर्देश। चर, कहीं भी इस्तेमाल किया जा सकता है <Directory ${FOO}> आदि।

अगर आपको यह पसंद नहीं है (और यह अच्छा नहीं है ..) आप टेम्पलेट से कॉन्फ़िगरेशन उत्पन्न कर सकते हैं m4 या कुछ अन्य टेम्पलेट भाषा।

अतिरिक्त:

एचआरएम, इसे बेहतर बनाने का एक तरीका बाहरी चर में सभी चरों को स्टोर करना होगा /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

और फिर इन्हें अपने अपाचे में शामिल करें init.d स्क्रिप्ट के साथ:

. /etc/httpd/conf/variables

कॉल करने से पहले httpd। अभी भी शानदार नहीं है लेकिन कम से कम यह स्टार्टअप स्क्रिप्ट और चर को अलग करता है।


14
2017-09-11 20:54



हम्म ... धन्यवाद - जबकि, जैसा कि आप कहते हैं, यह नहीं है काफी जैसा कि मैं उम्मीद कर रहा था उतना अच्छा, यह निश्चित रूप से कुछ भी नहीं है। धन्यवाद। - David Wolever
इन पर्यावरण चर के लिए एक बेहतर (और क्लीनर) जगह होगी /etc/sysconfig/httpd (रेडहाट, सेंटोस) या /etc/apache2/envvars (Ubuntu / डेबियन)। कुछ पर्यावरण चर पहले से ही हैं। - Stefan Lasiewski


आप mod_env और PassEnv निर्देश के साथ सिस्टम वातावरण चर का उपयोग कर सकते हैं। यहाँ देखें

डेबियन के लिए उदाहरण:

अपने चर को / etc / apache2 / envvars में जोड़ें (यह फ़ाइल चर को परिभाषित करने के लिए apache2ctl द्वारा उपयोग की जाती है)

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

अपाचे कॉन्फ़िगरेशन में अपना चर पास करें

PassEnv HOSTNAME

फिर आप सिस्टम पर्यावरण चर का उपयोग कर सकते हैं जैसे कि यह एक अपाचे चर था।

Header set Served-By %{HOSTNAME}e

7
2017-11-10 10:05



बहुत बहुत धन्यवाद - यद्यपि यह मेरे लिए apache 2.2 प्रतिशत 6.4 पर उत्तर प्रदान नहीं किया - यह मुझे सही दिशा +1 में इंगित किया - danday74
इसके लिए mod_define की आवश्यकता होती है, डिफ़ॉल्ट रूप से apache2.2 में लोड नहीं होती है। - Thomas


मुझे एक ही समस्या थी और, कुछ शोध के बाद, Apache 2.x के लिए समाधान ठीक ठीक इसे मेरे लिए हल किया (और कुछ और नहीं) यह था:

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

सावधान रहें कि अनपॅक करने के बाद आपको इसे ऐसा बनाना चाहिए (दस्तावेज़ों का इंस्टॉल हिस्सा अपाचे 2 का पालन करना भूल गया है?):

apxs2 -cia mod_define.c

फिर बनाएँ /etc/apache2/mods-available/define.load:

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

उसके बाद, मॉड्यूल का उपयोग कर सक्षम करें a2enmod जैसे आप सामान्य रूप से करेंगे।

उपरोक्त लिंक में दस्तावेज़ दिखाते हैं कि इसका उपयोग कैसे करें। अब आप सामान को परिभाषित कर सकते हैं और इसे सीधे उसी apache2 कॉन्फ़िगरेशन में उपयोग कर सकते हैं।


3
2018-01-24 16:39



यदि यह स्पष्ट नहीं है, तो यह सटीक कार्यक्षमता अपाचे 2.4 में डिफ़ॉल्ट रूप से उपलब्ध है। - ColinM


अविश्वसनीय लेकिन httpd 2.2 पर केंद्र 6.4 पर यह काम करता है

निर्यात env vars / etc / sysconfig / httpd में निर्यात करें

export mydocroot=/var/www/html

तो बस यह करो ...

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

फिर अंत में ....

service httpd restart;

2
2018-04-14 14:25





आप देखना चाहते हैं mod_passenger अपाचे के लिए जो django ऐप्स होस्ट भी कर सकता है। हम इसे बड़ी सफलता के साथ उपयोग करते हैं। आपको vhost में करने की ज़रूरत है, हम्म, बिल्कुल कुछ नहीं। केवल एक चीज जो आपको चाहिए वह एप्लिकेशन रूट में "सार्वजनिक" डीआईआर बनाना है और "मीडिया" जैसे "स्थिर" में "सार्वजनिक" में सिम्लिंक बनाएं (इससे स्थिर सेवा प्रदर्शन को बढ़ावा मिलेगा) और आपके दस्तावेज़ रूट को इंगित करें।

फिर निम्न फ़ाइल को "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()

अपने ब्राउज़र को फायर करें: यह काम करता है!


1
2017-09-11 22:03



आह, यह जानना अच्छा है - धन्यवाद। - David Wolever