Назад | Перейти на главную страницу

Использование переменных в файлах конфигурации Apache для уменьшения дублирования?

Можно ли использовать переменные в файлах конфигурации 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()

Запустите браузер: все работает!