Можно ли использовать переменные в файлах конфигурации Apache?
Например, когда я настраиваю сайт с помощью 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
И я хотел бы превратить '/ path / to / foo' в переменную, чтобы ее нужно было определить только в одном месте. Что-то вроде:
Variable FOO /path/to/foo
…
Спасибо!
Вы могли бы использовать mod_macro, который был включен в Apache httpd с версия 2.4
До этого его приходилось устанавливать отдельно, см. mod_macro. Например, в Debian: 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
Намного проще использовать 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
Вы можете включить или отключить бит конфигурации с помощью IfDefine но это, вероятно, не сделает то, что вы хотите. Вместо этого вы можете установить переменные среды в своем сценарии инициализации Apache для доступа в конфигурации. Например, добавив:
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}>
и т.п.
Если вам это не нравится (и это не очень приятно ..), вы можете создать конфигурацию из шаблона, используя м4 или какой-нибудь другой язык шаблонов.
ДОПОЛНИТЕЛЬНО:
Хм, один из способов сделать это лучше - сохранить все переменные во внешнем файле, возможно /etc/httpd/conf/variables.txt
:
FOO=/path/to/dir
ROLE=development
а затем включите их в свой Apache init.d
сценарий с:
. /etc/httpd/conf/variables
перед звонком httpd
. Все еще не блестяще, но, по крайней мере, он разделяет сценарий запуска и переменные.
Вы можете использовать системные переменные среды с mod_env и директивой PassEnv. Посмотреть здесь
Пример для debian:
Добавьте свою переменную в / etc / apache2 / envvars (этот файл используется apache2ctl для определения переменных)
...
export APACHE_PID_FILE=/var/run/apache2.pid
export HOSTNAME=$(hostname)
Передайте вашу переменную в конфигурацию apache
PassEnv HOSTNAME
Затем вы можете получить доступ к переменной системной среды, как если бы это была переменная apache.
Header set Served-By %{HOSTNAME}e
У меня была такая же проблема, и после некоторых исследований было найдено решение для Apache 2.x, которое именно решил это для меня (и не более того) было так:
http://people.apache.org/~rjung/mod_define/
Помните, что после распаковки вы должны собрать его вот так (часть документации по установке, похоже, забыла придерживаться apache2?):
apxs2 -cia mod_define.c
Затем создайте /etc/apache2/mods-available/define.load
:
LoadModule define_module /usr/lib/apache2/modules/mod_define.so
После этого включите модуль, используя a2enmod
как обычно.
Документы по ссылке выше показывают, как его использовать. Теперь вы можете очень просто определять материал и использовать его напрямую, все в одной конфигурации apache2.
невероятно, но на httpd 2.2 на centos 6.4 это работает
экспортировать переменные env в / etc / sysconfig / httpd
export mydocroot=/var/www/html
тогда просто сделай это ...
<VirtualHost *:80>
DocumentRoot ${mydocroot}
</VirtualHost>
потом наконец ....
service httpd restart;
Вы можете посмотреть mod_passenger для apache, который также может размещать приложения django. Мы пользуемся им с большим успехом. Все, что вам нужно сделать в vhost, это, хм, ровно ничего. Единственное, что вам нужно, это создать «общедоступный» каталог в корне приложения и создать в «общедоступном» символические ссылки на ваши статические каталоги, такие как «media» (это повысит производительность статического обслуживания), и указать на него свой DocumentRoot.
Затем поместите следующий файл в «public /../ пассажир_wsgi.py»:
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()
Запустите браузер: все работает!