it-swarm.asia

Çoğaltmayı azaltmak için Apache yapılandırma dosyalarında değişkenler mi kullanıyorsunuz?

Apache yapılandırma dosyalarında değişkenler kullanılabilir mi?

Örneğin, Django + WSGI ile bir site kurarken, yapılandırma 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' değişkenini bir değişkene çevirmek istiyorum, bu yüzden sadece tek bir yerde tanımlanması gerekiyor. Gibi bir şey:

Variable FOO /path/to/foo
…

Teşekkürler!

70
David Wolever

sürüm 2.4 tarihinden beri Apache httpd'ye dahil edilen mod_macro kullanabilirsiniz

Bundan önce ayrı olarak kurulması gerekiyordu, bkz. mod_macro . Örneğin Debian'da: 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/siteleri olarak temin edilebilen/vhost.mysite.com

Use VHost vhost.mysite.com 80
67
Graham Dumpleton

Define anahtar kelimesini kullanarak çok daha basit. Bakınız Yönerge Tanımla .

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
28
Mathieu J.

IfDefine ile yapılandırma bitlerini etkinleştirebilir veya devre dışı bırakabilirsiniz, ancak bu muhtemelen istediğinizi yapmaz. Bunun yerine, yapılandırma içinde erişmek için Apache başlangıç ​​komut dosyanızdaki ortam değişkenlerini ayarlayabilirsiniz. Örneğin:

HOSTNAME=$(hostname)

bir RHEL makinesinde /etc/init.d/httpd 'e (httpd! Bir komutun çıktısı olmak zorunda değildir - ortamda httpd başlatan bir değişken belirleyen her şey yolundadır. Değişkenler yapılandırmada şu şekilde kullanılabilir:

[[email protected] ~]# cat /etc/httpd/conf.d/test.conf
Header set X-Hostname ${HOSTNAME}

[[email protected] ~]# 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

Elbette, Header yönergesiyle sınırlı değilsiniz. Değişkenler <Directory ${FOO}> Vb. Gibi her yerde kullanılabilir.

Bunu beğenmediyseniz (ve bu hoş değil ..) m4 veya başka bir şablon dili kullanarak bir şablondan yapılandırma oluşturabilirsiniz.

[~ # ~] ek [~ # ~] :

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

FOO=/path/to/dir
ROLE=development

ve daha sonra bunları Apache init.d betiğinize ekleyin:

. /etc/httpd/conf/variables

httpd öğesini çağırmadan önce. Hala parlak değil ama en azından başlangıç ​​komut dosyasını ve değişkenleri ayırır.

14
markdrayton

Sistem ortam değişkenlerini mod_env ve PassEnv yönergesi ile kullanabilirsiniz. Buraya bakın

Debian örneği:

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 yapılandırmasına aktarın

PassEnv HOSTNAME

Daha sonra sistem ortamı değişkenine Apache değişkeni gibi erişebilirsiniz.

Header set Served-By %{HOSTNAME}e
7
Hadrien

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

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

Paketten çıkardıktan sonra böyle inşa etmeniz gerektiğini unutmayın (belgelerin kurulum kısmı Apache2'ye uymayı unutmuş gibi görünüyor mu?):

apxs2 -cia mod_define.c

Sonra /etc/Apache2/mods-available/define.load:

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

Bundan sonra, a2enmod normalde yaptığınız gibi.

Yukarıdaki bağlantıdaki dokümanlar, nasıl kullanılacağını gösterir. Artık her şeyi aynı Apache2 yapılandırmasında kolayca tanımlayabilir ve doğrudan kullanabilirsiniz.

3
Geradeausanwalt

inanılmaz ama centos 6.4 httpd 2.2 üzerinde bu çalışıyor

/ etc/sysconfig/httpd içindeki env değişkenlerini dışa aktar

export mydocroot=/var/www/html

o zaman bunu yapın ...

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

sonunda ....

service httpd restart;
2
danday74

Apache için mod_passenger 'a da bakabilirsiniz, bu da Host Django apps olabilir. Büyük bir başarıyla kullanıyoruz. Hayalette yapmanız gereken tek şey hmm İhtiyacınız olan tek şey, uygulama kökünde "genel" bir dizin oluşturmak ve "medya" (statik sunum performansını artıracaktır) gibi statik dizinlerinize "genel" içinde semboller oluşturmak ve DocumentRoot'unuzu buna yönlendirmektir.

Sonra aşağıdaki dosyayı "public /../ passenger_wsgi.py" dosyasına 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ı çalıştırın: Çalışıyor!

1
hurikhan77