Apache: быстрое добавление сайтов

Набросал простой скрипт, для удобного создания VirtualHost в debian.

Наверное тоже надоело лесть, создавать vhost по существующему, править пути, перезапускать сервер и так много раз и по кругу? А ещё не хватало опечататься?

Предлагаю такое решение: скрипт, делающий всю эту рутинную работу. Принимает только 1 аргумент - имя сайта и сам создаёт скелет и VirtualHost по шаблону.

В каталоге с сайтами создаётся папка с указанным именем. В ней - ещё 2 папки - log и www - для логов и сайта соответственно. А так же vhost - файл с описанием виртуального хоста по шаблону, лежащему в папке с сайтами. На этот файл создаётся симлинк в стандартное для дебиановского апача место - /etc/apache2/sites-avalable. После установки прав на созданные папки происходит вызов a2ensite и перезапуск апача. На скриншоте выше - кусочек такого скелета который получился после работы скрипта - из наутилуса

Разумеется, можно после создания vhost файла можно менять его содержимое - причём не залезая в папку /etc/apache2/.. Для меня это самый удобный вариант - т.к. достаточное количество дебианов с апачами поднял - и каждый раз нарывался на эти грабли, замедляющие настройку сервера.

Скрипт

Да, скрипт на php. Не было времени писать на чём то более "утончённом", да и не нужно это.
Всё, что потребуется - это исправить на нужный вам базовый каталог для сайтов

#!/usr/bin/php
<?php
/**
* Simple apache2 site creator
* by ruX[Ruslan Zaharov], http://ruX.pp.ru/
* (c) 2010
*/

// point path to your sites root
$www_base = "/sites/";
// point to your template location
$template = "{$www_base}template.conf";

// some variables(default on debian)
$sites_avalable = "/etc/apache2/sites-available/";
$a2ensite = "/usr/sbin/a2ensite";
$apache2 = "/etc/init.d/apache2";
$www_user = "www-data";

if (getmyuid() != 0) {
die("Sorry, {$argv[0]} need root access to run\n");
}

$site = $argv[1];
if (empty($site)) {
die("Use: {$argv[0]} sitename.com\n");
}

if (!file_exists($template)) {
die("ERROR: \$template variable should be correct!\n Just edit " . __FILE__ . "\n");
}

$site_prefix = "{$www_base}{$site}/";
if (file_exists($site_prefix)) {
die("Sorry, path '{$site_prefix}' already exists!\n");
}

$site_www = "{$site_prefix}www/";
$site_log = "{$site_prefix}log/";
$site_vhost = "{$site_prefix}vhost";

mkdir($site_prefix);
chown($site_prefix, $www_user);
mkdir($site_www);
chown($site_www, $www_user);
mkdir($site_log);
chown($site_log, $www_user);

$template_data = file($template);
$fvhost = fopen($site_vhost, "w");
foreach($template_data as $tstr) {
$tstr = str_replace("%site%", $site, $tstr);
$tstr = str_replace("%date%", date("r"), $tstr);
$tstr = str_replace("%site_prefix%", $site_prefix, $tstr);
$tstr = str_replace("%site_www%", $site_www, $tstr);
$tstr = str_replace("%site_log%", $site_log, $tstr);

fwrite($fvhost, $tstr);
}
fclose($fvhost);
chown($site_vhost, $www_user);

symlink($site_vhost, "{$sites_avalable}{$site}");

system("{$a2ensite} {$site}");
system("{$apache2} reload");

echo "Completed!\n";

?>


Его нужно положить как /usr/sbin/a2addsite, ну и соответственно дать права на выполнение(кстати, по понятным причинам его может выполнять только root).
Проще всего это сделать так:

  1. Скопировать код выше
  2. Под рутом выполнить cat > /usr/sbin/a2addsite
  3. Вставить из буфера в консоль
  4. Нажать Ctrl-D
  5. И дать права на выполнение: chmod a+x /usr/sbin/a2addsite

Шаблон

Как не сложно догадаться из дефолтных настроек скрипта, корень для сайтов у меня в /sites, значит, шаблон нужно сохранить в /sites/template.conf


#
# This is automatically generated vhost from template
# site: %site%
# created %date%

<VirtualHost *>
ServerAdmin %site%@someserver
ServerName www.%site%
ServerAlias %site%
DocumentRoot %site_www%
ErrorLog %site_log%/error.log
CustomLog %site_log%/access.log combined

<Directory "%site_www%">

</Directory>
</VirtualHost>

Можно менять на свой вкус что угодно :) Плейсхолдеры Placeholders по вкусу можно добавить в скрипт - по мне так этого достаточно.

Запуск

Как и писал, очень просто запуск, например так:
# a2addsite supersite.com
# a2addsite supersite.com
Enabling site supersite.com.
Run '/etc/init.d/apache2 reload' to activate new configuration!
Reloading web server config: apache2.
Completed!

Повторюсь, не надо перезапускать сервер - скрипт делает это сам.
Покажу, что получилось:

#
# This is automatically generated vhost from template
# site: supersite.com
# created Tue, 04 May 2010 02:12:39 +0000

<VirtualHost *>
ServerAdmin supersite.com@someserver
ServerName www.supersite.com
ServerAlias supersite.com
DocumentRoot /sites/supersite.com/www/
ErrorLog /sites/supersite.com/log//error.log
CustomLog /sites/supersite.com/log//access.log combined

<Directory "/sites/supersite.com/www/">

</Directory>
</VirtualHost>

Выглядит правдоподобно? Так ещё и работает =]
В добавок о скелете, что получилось:

boX:~# ls -Rl /sites/supersite.com/
/sites/supersite.com/:
total 12
drwxr-xr-x 2 www-data root 4096 May 4 02:12 log
-rw-r--r-- 1 www-data root 484 May 4 02:12 vhost
drwxr-xr-x 2 www-data root 4096 May 4 02:12 www

/sites/supersite.com/log:
total 0
-rw-r--r-- 1 root root 0 May 4 02:12 access.log
-rw-r--r-- 1 root root 0 May 4 02:12 error.log

/sites/supersite.com/www:
total 0

Как видно - всё верно. Структура соответствует задуманной и права выставлены соответственно.