Çoğaltmayı azaltmak için Apache yapılandırma dosyalarındaki değişkenlerin kullanılması?


67

Apache yapılandırma dosyalarında değişken kullanmak mümkün müdür?

Örneğin, Django + WSGI ile bir site kurarken, config dosyası şöyle görünebilir:

<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

Ve '/ path / to / foo' 'yu bir değişkene dönüştürmek istiyorum, bu yüzden sadece bir yerde tanımlanması gerekiyor. Gibi bir şey:

Variable FOO /path/to/foo
…

Teşekkürler!

Yanıtlar:


66

Apache httpd'ye 2.4 sürümünden beri dahil edilen mod_macro dosyasını kullanabilirsiniz.

Bundan önce ayrıca kurulması gerekiyordu, mod_macro'ya bakın . Debian Örneğin: apt-get install libapache2-mod-macro; a2enmod macro.

Örnek yapılandırma

/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
Ah, ihtiyacım olana benziyor. Utanç içinde yerleşik değildir… Ama sanırım yaşayabilirim. Teşekkürler!
David Wolever

3
Mükemmel! Bu, yapmayı düşündüğümden çok daha iyi yapmayı planladığım şeyi yapıyor.
SpoonMeiser

5
@ PoonMeiser Bu modül Apache HTTP Sunucusuna 2.4.6 sürümünden itibaren entegre edilmiştir. httpd.apache.org/docs/current/mod/mod_macro.html
Ludwig

24

DefineAnahtar kelimeyi kullanarak çok daha basit . Bkz . Direktif Tanımlama .

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
Mükemmel. Bu mükemmel çalışıyor.
David Tonhofer

Not The variable is always globally defined and not limited to the scope of the surrounding config section.Muhtemelen her biri için (şimdilik test etmedi) Birden vhosts varsa, (farklı bir değerle) aynı değişkeni kullanamazsınız, anlamına gelir.
Pierre-Olivier Vares

@ Pierre-OlivierVares Doğru, bunları sabit olarak görün. Bu yüzden BÜYÜK HARF kullanıyorum. Onları global olarak VirtualHost dışında tanımladım
Mathieu J.

14

IfDefine ile yapılandırma bitlerini etkinleştirebilir veya devre dışı bırakabilirsiniz ancak bu muhtemelen istediğiniz şeyi yapmaz. Bunun yerine, yapılandırma değişkenlerine erişmek için Apache init betiğinizde ortam değişkenlerini ayarlayabilirsiniz. Örneğin, ekleyerek:

HOSTNAME=$(hostname)

için /etc/init.d/httpd(çağıran hat önce httpdbir RHEL makinede!) bir değişken olarak yer makinenin ana bilgisayar adını geçirir. Bir komutun çıktısı olmak zorunda değildir - başlatılan ortamda değişken ayarlayan herhangi bir şey httpdiyidir. Değişkenler aşağıdaki gibi konfigürasyonda kullanılabilir:

[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

Tabii ki, Headerdirektifle sınırlı değilsin . Değişkenler <Directory ${FOO}>vb. Her yerde kullanılabilir .

Bundan hoşlanmıyorsanız (ve o kadar da hoş değil ..) bir şablondan m4 veya başka bir şablon dilini kullanarak bir yapılandırma oluşturabilirsiniz .

Ek :

Hrm, daha iyi hale getirmenin bir yolu, tüm değişkenleri harici bir dosyada depolamak olabilir, belki de /etc/httpd/conf/variables.txt:

FOO=/path/to/dir
ROLE=development

ve sonra bunları Apache init.dbetiğinize ekleyin :

. /etc/httpd/conf/variables

aramadan önce httpd. Yine de mükemmel değil ama en azından başlangıç ​​komut dosyasını ve değişkenlerini ayırır.


ssdd ... Teşekkürler - Dediğiniz gibi, bu değil, süre oldukça Beklediğim gibi güzel, kesinlikle hiç yoktan iyidir. Teşekkürler.
David Wolever

11
Bu ortam değişkenleri için daha iyi (ve daha temiz) bir yer /etc/sysconfig/httpd(RedHat, CentOS) veya /etc/apache2/envvars(Ubuntu / Debian) olacaktır. Bazı çevre değişkenleri zaten var.
Stefan Lasiewski

7

Sistem ortam değişkenlerini mod_env ve PassEnv yönergesiyle kullanabilirsiniz. Buraya bak

Debian için örnek:

Değişkeninizi / etc / apache2 / envvars dizinine ekleyin (bu dosya apache2ctl tarafından değişkenleri tanımlamak için kullanılır)

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

Değişkeninizi apache config içine geçirin

PassEnv HOSTNAME

Daha sonra bir apache değişkenimiş gibi sistem ortam değişkenine erişebilirsiniz.

Header set Served-By %{HOSTNAME}e

1
çok teşekkürler - bu benim için cevap vermediyse de apache 2.2 centos 6.4 - doğru yönde işaret etti +1
danday74

Bu, varsayılan olarak apache2.2'ye yüklenmemiş mod_define gerektirir.
Thomas

3

Aynı problemi yaşadım ve bir araştırmadan sonra Apache 2.x için çözümü tam olarak benim için çözdüm (ve daha fazlası değil):

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

Ambalajı açtıktan sonra böyle inşa etmeniz gerektiğine dikkat edin (docs'ın yükleme kısmı apache2'ye uymayı unutmuş görünüyor?):

apxs2 -cia mod_define.c

Ardından oluşturun /etc/apache2/mods-available/define.load:

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

Bundan sonra, a2enmodnormalde yapacağınız gibi kullanarak modülü etkinleştirin .

Yukarıdaki bağlantıdaki dokümanlar nasıl kullanılacağını gösterir. Artık her şeyi aynı apache2 config içinde tanımlayabilir ve doğrudan kullanabilirsiniz.


Bu net değilse, bu aynı işlevsellik Apache 2.4'te varsayılan olarak mevcuttur.
ColinM

2

inanılmaz ama httpd 2.2'de centos 6.4'te bu işe yarıyor

env dışa aktarma / etc / sysconfig / httpd içinde değişir

export mydocroot=/var/www/html

o zaman basitçe şunu yap ...

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

sonunda ....

service httpd restart;

bunun nedeni muhtemelen (bazıları) /etc/sysconfig/httpdiçeriğin, apache değişkenlerini tanımlayan (yönergeye httpd -Deşdeğer ) girmesidir define.

1

Django uygulamalarını da barındıran apache için mod_passenger'a bakmak isteyebilirsiniz . Büyük bir başarı ile kullanıyoruz. Sadece vhost'ta yapmanız gereken şey, hmm, tam olarak hiçbir şey. İhtiyacınız olan tek şey, uygulama kökünde bir "genel" dir oluşturmak ve "medya" (statik hizmet performansını artıracak) gibi "medya" gibi statik dizinlerinize sembolik bağlantılar oluşturmak ve DocumentRoot'unuzu işaret etmektir.

Sonra aşağıdaki dosyayı "public /../ passenger_wsgi.py" içine yerleştirin:

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

Tarayıcınızı ateşleyin: Çalışıyor!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.