ডুপ্লিকেশন হ্রাস করতে অ্যাপাচি কনফিগারেশন ফাইলগুলিতে ভেরিয়েবল ব্যবহার করছেন?


67

অ্যাপাচি কনফিগারেশন ফাইলগুলিতে কি ভেরিয়েবল ব্যবহার করা সম্ভব?

উদাহরণস্বরূপ, আমি যখন জ্যাঙ্গো + ডাব্লুএসজিআই দিয়ে কোনও সাইট সেট আপ করছি তখন কনফিগারেশন ফাইলটি দেখতে দেখতে এমন হতে পারে:

<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

এবং আমি '/ পাথ / থেকে / ফু /' পরিবর্তনশীলতে রূপান্তর করতে চাই তাই এটি কেবলমাত্র এক জায়গায় সংজ্ঞায়িত করা দরকার। কিছুটা এইরকম:

Variable FOO /path/to/foo
…

ধন্যবাদ!

উত্তর:


66

আপনি মোড_ম্যাক্রো ব্যবহার করতে পারেন , এটি অ্যাপাচি httpd সংস্করণ ২.৪ থেকে অন্তর্ভুক্ত করা হয়েছে

এর আগে এটি আলাদাভাবে ইনস্টল করতে হবে, মোড_ম্যাক্রো দেখুন । ডেবিয়ান উপর উদাহরণস্বরূপ: 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
অসাধারণ! এটি করা সম্ভব হবে বলে আমি ভেবেছিলাম তার থেকেও অনেক বেশি ভাল করার জন্য আমি যা করার পরিকল্পনা করছিলাম does
চামচমাইজার

5
@ স্পুনমিজার এই মডিউলটি ২.৪..6 সংস্করণ থেকে অ্যাপাচি এইচটিটিপি সার্ভারে একীভূত করা হয়েছে। 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

আপনি ইফডিফাইন দিয়ে কনফিগারেশনের বিট সক্ষম বা অক্ষম করতে পারেন তবে এটি সম্ভবত আপনি যা চান তা করবে না। পরিবর্তে, আপনি কনফিগারেশনের মধ্যে অ্যাক্সেসের জন্য আপনার অ্যাপাচি init স্ক্রিপ্টে পরিবেশ পরিবর্তনশীল সেট করতে পারেন। উদাহরণস্বরূপ, যোগ করা:

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}>ইত্যাদি etc.

আপনি যদি এটি পছন্দ না করেন (এবং এটি খুব সুন্দর না ..) আপনি এম 4 বা অন্য কোনও টেম্পলেট ভাষা ব্যবহার করে কোনও টেম্পলেট থেকে একটি কনফিগারেশন তৈরি করতে পারেন ।

সংযোজন :

এইচআরএম, এটির আরও ভাল করার একটি উপায় হ'ল সমস্ত ভেরিয়েবলগুলি একটি বাহ্যিক ফাইলে সংরক্ষণ করা, সম্ভবত /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

এবং তারপরে এগুলি আপনার অ্যাপাচি init.dস্ক্রিপ্টের সাথে অন্তর্ভুক্ত করুন:

. /etc/httpd/conf/variables

কল করার আগে httpd। এখনও উজ্জ্বল নয় তবে কমপক্ষে এটি স্টার্টআপ স্ক্রিপ্ট এবং ভেরিয়েবলগুলি পৃথক করে।


hhmm ... ধন্যবাদ - যখন, যেমন আপনি বলতে, এই নয় বেশ যেমন চমৎকার হিসাবে আমি জন্য প্রত্যাশী হয়, এটা অবশ্যই কিছুই বেশী ভালো। ধন্যবাদ।
ডেভিড ওলবার 21

11
এই পরিবেশের ভেরিয়েবলগুলির জন্য আরও ভাল (এবং ক্লিনার) জায়গাটি /etc/sysconfig/httpdহ'ল (রেডহ্যাট, সেন্টোস) বা /etc/apache2/envvars(উবুন্টু / দেবিয়ান)। কিছু পরিবেশের ভেরিয়েবল ইতিমধ্যে রয়েছে।
স্টিফান লাসিউইস্কি

7

আপনি mod_env এবং PassEnv নির্দেশিকা সহ সিস্টেম এনভায়ারনমেন্ট ভেরিয়েবলগুলি ব্যবহার করতে পারেন। এখানে দেখো

ডিবিয়ান উদাহরণ:

আপনার ভেরিয়েবলটি / etc / apache2 / envvars এ যুক্ত করুন (এই ফাইলটি ভেরিয়েবলগুলি সংজ্ঞায়িত করতে অ্যাপাচি 2ctl দ্বারা ব্যবহৃত হয়)

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

আপনার পরিবর্তনশীল অ্যাপাচি কনফিগারেশনে পাস করুন

PassEnv HOSTNAME

তারপরে আপনি সিস্টেম এনভায়রনমেন্ট ভেরিয়েবল অ্যাক্সেস করতে পারবেন যেমন এটি যদি অ্যাপাচি ভেরিয়েবল হয়।

Header set Served-By %{HOSTNAME}e

1
অনেক ধন্যবাদ - যদিও এটি
অ্যাপাচি ২.২ সেন্টোস os.৪-

এটির জন্য Mod_define প্রয়োজন, ডিফল্টরূপে অ্যাপাচি 2.2 এ লোড হয় না।
থমাস

3

আমার একই সমস্যা ছিল এবং কিছু গবেষণা করার পরে, অ্যাপাচি ২.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 কনফিগারেশনের মধ্যে।


যদি বিষয়টি পরিষ্কার না হয় তবে অ্যাপাচি ২.৪-এ ডিফল্টরূপে ঠিক একই কার্যকারিতাটি উপলব্ধ।
কলিনম

2

অবিশ্বাস্য তবে 6.4 সেন্টোডে এইচডিডি ২.২ এ কাজ করে

/ etc / sysconfig / httpd এ এনভির ভার্সা রফতানি করুন

export mydocroot=/var/www/html

তাহলে কেবল এই কাজটি করুন ...

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

তাহলে শেষ পর্যন্ত ....

service httpd restart;

এটি সম্ভবত কারণ (কিছু) /etc/sysconfig/httpdবিষয়বস্তুতে httpd -D( defineনির্দেশকের সমতুল্য ) যায় যা অ্যাপাচি ভেরিয়েবলগুলি সংজ্ঞায়িত করে।

1

আপনি অ্যাপাচি এর জন্য মোড_প্যাসেঞ্জারটি সন্ধান করতে চাইতে পারেন যা জ্যাঙ্গো অ্যাপ্লিকেশনগুলিও হোস্ট করতে পারে। আমরা এটি দুর্দান্ত সাফল্যের সাথে ব্যবহার করি। ভোস্টে আপনাকে যা করতে হবে তা হুম, ঠিক কিছুই নয়। আপনার কেবলমাত্র প্রয়োজনটি হ'ল অ্যাপ্লিকেশন রুটে একটি "পাবলিক" দির তৈরি করা এবং "মিডিয়া" এর মতো আপনার স্ট্যাটিক ডিরেক্টরিগুলিতে "পাবলিক" তে সিমলিংক তৈরি করা (এটি স্ট্যাটিক পরিবেশনার কর্মক্ষমতা বাড়িয়ে তুলবে) এবং এটির জন্য আপনার ডকুমেন্টরুটটি নির্দেশ করুন।

তারপরে নিম্নলিখিত ফাইলটিকে "সর্বজনীন /../ যাত্রী_উস.কি." এ রাখুন:

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

আপনার ব্রাউজার জ্বালিয়ে দিন: এটি কাজ করে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.