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!
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
.
/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
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
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.
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
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.
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;
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!