Пусть Apache обслуживает несколько каталогов через один <Location> - PullRequest
5 голосов
/ 21 марта 2009

У меня проблема с обслуживанием большого количества виртуальных хостов, и мне было интересно, есть ли более эффективный способ сделать это.

В настоящее время я использую директиву Location для обслуживания большого количества проектов из разных отделов, всего более 300 проектов из 19 отделов. Структуры одинаковы для каждой директивы Location, за исключением каталогов, из которых обслуживаются файлы. В настоящее время у меня есть большой файл, который выглядит примерно так:

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /departmentA/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentA/project2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project2/passwords 
      Require valid-user 
   </Location> 

   <Location /departmentB/project1> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/departmentA/project1/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>

Как видите, все эти структуры одинаковы, за исключением путей. Конечно, мне бы хотелось, чтобы я мог использовать переменные для названий отделов и проектов и просто поддерживать единую директиву Location. Я предполагаю, что это также менее тяжело на сервере и памяти.

<VirtualHost *> 
   ServerName www.myserver.com 

   <Location /$1/$2> 
      AuthType Basic 
      AuthName "By Invitation Only" 
      AuthUserFile /usr/local/$1/$2/passwords 
      Require valid-user 
   </Location> 
</VirtualHost>

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Вы пробовали директиву ?

Требуется регулярное выражение вместо пути. В зависимости от ваших путей и связанных с ними подопций вы можете уменьшить количество сотен директив до более управляемой из них.

1 голос
/ 21 марта 2009

Я не знаю, как конкретно это сделать, так как не думаю, что AuthUserFile принимает динамический аргумент. Возможно, будет проще написать небольшой скрипт на выбранном вами языке, который берет шаблон для блока <Location> и повторяет его для каждого каталога, который вы хотите защитить. Пример в Python:

#!/usr/bin/python
import sys
print '<VirtualHost *:80>'
print '   ServerName www.myserver.com'
for path in sys.stdin:
    print '   <Location /%s>' % path.strip()
    print '      AuthType Basic'
    print '      AuthName "By Invitation Only"'
    print '      AuthUserFile /usr/local/%s/passwords' % path.strip()
    print '      Require valid-user'
    print '   </Location>'
print '</VirtualHost>'

Для каждой строки формы 'DepartmentA / project1', которую он читает на стандартном вводе, выводится соответствующий раздел <Location>.

...