Большая часть web-разработки проходит у меня на данный момент в Windows и под Apache. При этом часто приходится создавать локальные домены (и часто удалять их). При этом процесс создания обычно следующий:
- Вспомнить, где у меня лежит
vhosts.conf
и найти его - Скопипастить одну из секций
<VirtualHost>
- Внести в неё нужные изменения для нового домена
- Выдумать домену уникальный локальный IP и указать его тут же
- Откопать глубоко в недрах папки
Windows
файлhosts
и добавить IP туда - Перезапустить Apache
- PROFIT
Это утомляло мою лентяйскую натуру. Кроме того, я намеревался написать какую-нибудь простенькую утилитку на Python, для лучшего изучения этого, пока ещё тёмного для меня языка. Встречайте — Hostgen.py, может даже кому-нибудь пригодится. (Брать — здесь, zip 11K)
Установка и запуск
Качаем по ссылке, расапковываем в какую-нибудь папку, запускаем hostgen.py
. Не запустился — значит у вас не установлен Python
: устанавливаем или забиваем.
Подождите не запускайте! А то вдруг что-нибудь перезапишите не то. Сначала немного почитайте.
Конфигурация
Все настройки утилиты лежат в файле config.py
, замените их на собственные.
Утилита при запуске разбирает собственные шаблоны (ниже), после чего делает следующее:
- Записывает данные в
hosts
- Перезаписывает
vhosts.conf
- Перезапускает 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.loc
→ c:/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
…
Если для поддомена нужно что-то более нестандартное — просто опишите его, как отдельный хост.
Жуть, вот тебе делать нефиг :)
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