नकल को कम करने के लिए Apache config फाइल में चर का उपयोग करना?


67

क्या Apache config फाइल में वैरिएबल का उपयोग करना संभव है?

उदाहरण के लिए, जब मैं 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

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

Variable FOO /path/to/foo
…

धन्यवाद!

जवाबों:


66

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

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

1
आह, यह वही दिखता है जो मुझे चाहिए। यह शर्म की बात नहीं है ... लेकिन मुझे लगता है कि मैं रह सकता हूं। धन्यवाद!
डेविड वूल्वर ने

3
अति उत्कृष्ट! यह वही है जो मैं करने के लिए जितना मैंने सोचा था उससे बेहतर करने की योजना बना रहा था।
स्पूनमाइज़र

5
@SpoonMeiser यह मॉड्यूल 2.4.6 संस्करण से Apache HTTP सर्वर में एकीकृत है। httpd.apache.org/docs/current/mod/mod_macro.html
लुडविग

24

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

2
अति उत्कृष्ट। यह पूरी तरह से अच्छी तरह से काम करता है।
डेविड टोनहोफर

ध्यान दें कि The variable is always globally defined and not limited to the scope of the surrounding config section.इसका संभवतः मतलब है (मैंने इसे अभी के लिए परीक्षण नहीं किया है), यदि आपके पास कई vhosts हैं, तो आप प्रत्येक के लिए एक ही चर (एक अलग मूल्य के साथ) का उपयोग नहीं कर सकते हैं।
पियरे-ओलिवियर वेर

@ पियरे-ओलिवियरवेयर सही, उन्हें कॉन्स्टेंट के रूप में देखें। यही कारण है कि मैं बड़े अक्षरों का उपयोग करता हूं। मैं उन्हें वर्चुअलहोस्ट के बाहर विश्व स्तर पर परिभाषित करता हूं
मैथ्यू जे।

14

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

HOSTNAME=$(hostname)

करने के लिए /etc/init.d/httpd(से पहले लाइन है कि कॉल httpd!) एक RHEL मशीन पर एक चर के रूप में में मशीन का होस्ट गुजरता है। इसमें कमांड का आउटपुट होना जरूरी नहीं है - कुछ भी जो पर्यावरण में एक चर सेट करता है जो लॉन्च करता 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 या किसी अन्य टेम्पलेट भाषा का उपयोग करके टेम्पलेट से कॉन्फ़िगरेशन उत्पन्न कर सकते हैं।

अतिरिक्त :

Hrm, इसे बेहतर बनाने का एक तरीका बाहरी फ़ाइल में सभी चर को संग्रहीत करना होगा, शायद /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

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

. /etc/httpd/conf/variables

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


hhmm ... धन्यवाद - जबकि, जैसा कि आप कहते हैं, यह उतना अच्छा नहीं है जितना मैं उम्मीद कर रहा था, यह निश्चित रूप से कुछ भी नहीं से बेहतर है। धन्यवाद।
डेविड वॉलेवर

11
इन पर्यावरण चर के लिए एक बेहतर (और क्लीनर) जगह /etc/sysconfig/httpd(RedHat, CentOS) या /etc/apache2/envvars(Ubuntu / Debian) होगी। कुछ पर्यावरण चर पहले से ही हैं।
स्टीफन लासिवस्की

7

आप 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

1
बहुत बहुत धन्यवाद - हालांकि यह मेरे लिए अपाचे 2.2 सेंटो 6.4 पर जवाब प्रदान नहीं किया - यह मुझे सही दिशा में +1 किया
danday74

इसके लिए mod_define की आवश्यकता होती है, डिफ़ॉल्ट रूप से apache2.2 में लोड नहीं किया जाता है।
थॉमस

3

मुझे भी यही समस्या थी और कुछ शोधों के बाद, 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सामान्य रूप से आपके जैसे मॉड्यूल का उपयोग करें ।

ऊपर दिए गए लिंक में डॉक्स दिखाते हैं कि इसका उपयोग कैसे करना है। अब आप बहुत आसानी से सामान को परिभाषित कर सकते हैं और इसे सीधे उपयोग कर सकते हैं, सभी एक ही अपाचे 2 के भीतर।


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

2

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

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

export mydocroot=/var/www/html

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

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

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

service httpd restart;

यह शायद इसलिए है क्योंकि (कुछ में) /etc/sysconfig/httpdसामग्री httpd -D( defineनिर्देश के समतुल्य ) जाती है जो अपाचे चर को परिभाषित करती है।

1

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

फिर निम्न फ़ाइल को "सार्वजनिक /../ यात्री_विशेष" में रखें:

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.