Hostgen.py: генератор конфигов Apache под Win

Большая часть web-разработки проходит у меня на данный момент в Windows и под Apache. При этом часто приходится создавать локальные домены (и часто удалять их). При этом процесс создания обычно следующий:

  1. Вспомнить, где у меня лежит vhosts.conf и найти его
  2. Скопипастить одну из секций <VirtualHost>
  3. Внести в неё нужные изменения для нового домена
  4. Выдумать домену уникальный локальный IP и указать его тут же
  5. Откопать глубоко в недрах папки Windows файл hosts и добавить IP туда
  6. Перезапустить Apache
  7. PROFIT

Это утомляло мою лентяйскую натуру. Кроме того, я намеревался написать какую-нибудь простенькую утилитку на Python, для лучшего изучения этого, пока ещё тёмного для меня языка. Встречайте — Hostgen.py, может даже кому-нибудь пригодится. (Брать — здесь, zip 11K)

Установка и запуск

Качаем по ссылке, расапковываем в какую-нибудь папку, запускаем hostgen.py. Не запустился — значит у вас не установлен Python: устанавливаем или забиваем.

Подождите не запускайте! А то вдруг что-нибудь перезапишите не то. Сначала немного почитайте.

Конфигурация

Все настройки утилиты лежат в файле config.py, замените их на собственные.

Утилита при запуске разбирает собственные шаблоны (ниже), после чего делает следующее:

  1. Записывает данные в hosts
  2. Перезаписывает vhosts.conf
  3. Перезапускает Apache

Запись в hosts

Первым делом нужно указать путь к этому файлу в config.py:

PATH_HOSTS = "c:/windows/system32/drivers/etc/hosts"

Для тестов можно указать другой.

При первом запуске данные будут записаны в конец файла и обрамлены комментариями. Типа такого:

# Hostgen (12-03-2010, 12:39:24)
127.0.0.2 libs.loc
127.0.0.2 www.libs.loc
127.0.0.3 test.loc
# End hostgen

В дальнейшем все изменения будут вноситься между этими комментариями. Можете переместить секцию на удобное место в файле, окружающий текст затронут не будет.

Генерация vhosts.conf

Так же в config.py указываем путь к своему vhosts.conf:

PATH_VHOSTS = "c:/web/apache/conf/vhosts.conf"

vhosts.conf собирается на основании нескольких входных файлов, указанных в списке:

INPUT_FILES = [
               "vhosts-begin.conf",
               "hosts.tpl",
               "hosts-test.tpl",
               "vhosts-end.conf"
]

Эти файлы ищутся в подкаталоге tpl утилиты. Однако, если хочется, можно указать и абсолютный путь.

conf-файлы

Содержимое файлов, имеющих расширение .conf добавляется в vhosts.conf без каких-либо изменений.

Если нужно добавить какие-то директивы вне VirtualHost, я их записываю vhosts-begin.conf. Если по какой-то причине их нужно дописать в конец файла, для этого есть vhosts-end.conf.

tpl-файлы

Файлы с расширением .tpl являются шаблонами хостов, на основании которых генерируются секции <VirtualHost>.

В hosts.tpl я пишу основные хосты, в hosts-test.tpl тестовые и временные.

Формат tpl-шаблонов

# Пример tpl-файла
Host  libs.loc
 
Host  test.loc
Alias www
 
Host blgo.loc
Root blgo/blgo.loc/www
 
Host footburg.loc
Root footburg/footburg.loc/www
 
Host kinsburg.loc
Root kinsburg/kinsburg.loc/htdocs
Subdomains     ava thumbs quiz people frames
SubdomainsPath kinsburg/subdomains
 
Host pyha.loc
Root pyha/pyha.loc

Пустые строки и начинающиеся на «#» игнорируются. Остальные состоят, как обычно из имени директивы и её значения.

Директива Host указывает начало описание хоста, все последующие директивы, вплоть до следующего Host относятся к этому хосту.

И, о магия :) одна строчка «Host libs.loc» порождает конфиг:

<VirtualHost 127.0.0.2&>
    DocumentRoot "c:/web/sites/libs.loc"
    ServerName   libs.loc
    ServerAdmin  admin@localhost
    ErrorLog     "logs/libs_loc-error.log"
    CustomLog    "logs/libs_loc-access.log" common
</VirtualHost>

ServerName

ServerName просто берётся из значения директивы Host.

DocumentRoot

Я обычно держу все сайты в одном базовом каталоге. Он указан в config.py:

WWW_BASEDIR = "c:/web/sites"

По умолчанию, хосты лежат в подпапках, соответствующих их названию. libs.locc:/web/sites/libs.loc.

Если нужно более сложная структура, есть директива Root:

Host footburg.loc
Root footburg/footburg.loc/www

Здесь путь будет отсчитываться от всё того же WWW_BASEDIR: c:/web/sites/footburg/footburg.loc/www.

При необходимости, можно указать в Root и абсолютный путь от корня диска.

ServerAlias

Если нужны алиасы, просто перечисляем их, как обычно, через пробел в Alias:

Host example.com
Alias example.ru example.ua

Для того, чтобы просто подставить «www», достаточно одного этого «www»:

Host  test.loc
Alias www      # www.test.loc

ServerAdmin

От ServerAdmin на локалке обычно толку мало. По умолчанию он просто берётся из config.py:

SERVER_ADMIN = "admin@localhost"

Но можно указать его и явно:

Host example.com
ServerAdmin admin@example.com

ErrorLog, CustomLog

Пути к логам формируются на основании настроек config.py:

ERROR_LOG_PATTERN  = '"logs/{host}-error.log"' 
CUSTOM_LOG_PATTERN = '"logs/{host}-access.log" common'

В этих шаблонах {host} заменяется на имя хоста (при этом «.» заменяется на «_»). Например:

ErrorLog     "logs/libs_loc-error.log"
CustomLog    "logs/libs_loc-access.log" common

Если нужно писать логи всех хостов в один файл, просто уберите {host} из шаблона.

Если логи вообще не нужны, отключите:

ERROR_LOG_PATTERN  = False
CUSTOM_LOG_PATTERN = False

enable

Домен временно не нужен, но удалять или целиком комментировать его не охота:

Host a.loc
enable off

<include>

Если нужно вставить какие-то другие директивы, кроме стандартных, воспользуйтесь секцией <include>. Например, для хоста php53.loc включаем PHP 5.3, как CGI (в то время, как на остальных — 5.2):

Host php53.loc
<include>
    AddType application/x-httpd-php53 php
    <Directory "c:/web/php53">
        Options ExecCGI
    </Directory>
    ScriptAlias "/php53_dir/" "c:/web/php53/"
    Action application/x-httpd-php53 "/php53_dir/php-cgi.exe"
</include>

Выдача IP

IP можно выдать один на все хосты:

IP_STATIC = "127.0.0.1"

Либо разные:

IP_STATIC  = False
IP_PATTERN = "127.0.0.*"
IP_START   = 2

В последнем случае IP будут выдаваться по порядку: 127.0.0.2, 127.0.0.3 …

Или указать IP явно:

Host: example.loc
IP: 127.0.0.127

Поддомены

Host kinsburg.loc
Subdomains ava thumbs quiz people frames

В этом случае будут созданы поддомены ava.kinsburg.loc, thumbs.kibsburg.loc … и каждому выдан свой IP.

DocumentRoot в этом случае у них будет стандартный: WWW_BASE/ava.kinsburg.loc

Можно указать другой:

Host kinsburg.loc
Subdomains ava thumbs quiz people frames
SubdomainsPath kinsburg/subdomains

Теперь поддомены будут лежать в отдельной папке: WWW_BASE/kinsburg/subdomains/ava

Если для поддомена нужно что-то более нестандартное — просто опишите его, как отдельный хост.

9 комментариев »

  • Жуть, вот тебе делать нефиг :)

    adw0rd, 12.03.2010, 14:23

  • http://www.cherokee-project.com/ вот это посмотри, может заинтересует

    adw0rd, 12.03.2010, 14:25

  • ну тоже парит делать это ручками. а нельзя это переписать под пхп и с приятным веб интерфейсом. Пых то у всех тут есть, а вот питона нима. Чтобы можно было зайти на локальный сервер, ввести все данные, нажать кнопку ОК, а сервис проверил корректность и если все нормально, внес все изменения или же сказал, что не так. было бы очень кстати.

    И кстати почему Zend Server такого не умеет, лошпеки там что ли? надо забросить им твою идею.

    alexey_baranov, 12.03.2010, 14:55

  • Мне как-то удобнее было одной прогой и хотел на питоне написать что-нибудь.

    >а нельзя это переписать под пхп и с приятным веб интерфейсом
    У нас на pyha.ru есть правило — «предложил, делай» :-D

    vasa_c, 12.03.2010, 15:13

  • как сложно. У меня всей этой рутиной занимается Денвер

    Абырвалг, 12.03.2010, 15:47

  • Раз уж все равно на этом вашем пайтоне мэй би сделаешь как модуль к такой штуке: http://habrahabr.ru/blogs/i_am_advertising/87329/ ?

    dallone, 13.03.2010, 1:23

  • черт прочитал что это все про Windows комментарий снят :)

    dallone, 13.03.2010, 1:37

  • В принципе, к винде особо ничего не привязано. Изменить конфиг и запускать из под рута и будет работать, скорее всего :)

    vasa_c, 13.03.2010, 11:39

  • Я тоже колбасился с этой темой, а потом плюнул и поставил denwer :) Я не гордый. Те VirtualHost, которые УЖЕ были настроены, я не стал описывать в правилах денвера, а просто вынес в отдельный файл persistent.conf и подключил его следом за автогенерируемым денверовским:

    Include conf/vhosts.conf
    Include conf/persistant.conf

    Теперь если мне нужен сайт-однодневка, я создаю/грохаю его как принято в денвере. А постоянные «локальные зекрала» живут сами по себе.

    artoodetoo, 4.06.2010, 8:56

Leave a comment