Документация ISPmanager Business

Шаблонизатор конфигурационных файлов

Для ISPmanager реализован новый механизм генерации конфигурационных файлов Apache и Nginx. Механизм основан на разборе шаблона, который позволяет использовать логические ветвления и подстановку параметров, и дает большую гибкость в создании, редактировании конфигурационных файлов веб серверов. Благодаря шаблонному подходу появилась возможность использовать необходимые параметры для настройки веб-серверов Apache и Nginx. Кроме того, после дополнения конфигурационного файла параметрами пользователя, никакие операции шаблонизатора не изменят эти данные. Начиная с версии 5.57 ISPmanager использует по умолчанию данный механизм. В этой статье будет рассказано, как начать использовать шаблонизатор, об общих принципах работы и его синтаксических конструкциях.

Как начать использовать шаблонизатор?


Если вы используете свежую установку ISPmanager 5.57 и старше, то шаблонизатор используется по умолчанию для генерации конфигурационных файлов модуля WWW-домены. Если вы обновили панель управления до версии 5.57 или до более поздней версии, тогда необходимо установить параметр Option EnableWebTemplate в конфигурационном файле панели управления ISPmanager Business в /usr/local/mgr5/etc/ispmgr.conf расположенный на локальном узле кластера, после чего необходимо перезапустить панель управления.

Начиная с версии 5.57 опция AlphaWebTemplate, с помощью которой ранее включался данный механизм, более не доступна.

Общие принципы работы шаблонизатора


В модуле WWW-домены каждой функции соответствует свой шаблон конфигурационного файла. Например, функциям создания и редактирования веб-домена соответствует шаблон записанный в файле /usr/local/mgr5/etc/templates/default/apache2-vhosts.template для конфигурационного файла Apache и /usr/local/mgr5/etc/templates/default/nginx-vhosts.template для конфигурационного файла Nginx.

Файлы с шаблонами конфигураций могут быть переопределены пользовательскими параметрами. Для этого просто скопируйте файл с шаблоном в директорию /usr/local/mgr5/etc/templates с тем же именем. Если в директории /usr/local/mgr5/etc/templates есть файл шаблона, шаблон в директории /usr/local/mgr5/etc/templates/default/ игнорируется. При обновлении панели файлы в директории /usr/local/mgr5/etc/templates/default/ будут перезаписаны, поэтому все правки нужно производить в /usr/local/mgr5/etc/templates/.

Ниже, в таблице, указано соответствие файла с шаблоном вызываемой функции в модуле WWW-домены.

Функция

Шаблон Nginx

Шаблон Apache

Создание/Редактирование WWW-домена

nginx-vhosts.template
nginx-vhosts-ssl.template

apache2-vhosts.template
apache2-vhosts-ssl.template

Создание/Редактирование/Удаление cтраницы ошибки

nginx-error-page.template

apache2-error-page.template

Создание/Редактирование/Удаление редиректов

nginx-rewrite.template

apache2-redirect.template

Создание/Удаление доступов

nginx-access.template

apache2-access.template

Включение/Выключение WWW-домена

nginx-suspend.template

apache2-suspend.template

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

Синтаксис


Все шаблонные конструкции должны быть расположены между парой тегов *{%* и *%}*. Например, переменная должна быть записана следующим образом: *{% $VARIABLE_NAME %}*.

Переменные

Имя переменной должно соответствовать следующим требованиям:

  • записано в верхнем регистре
  • начинается со знака $
  • совпадает с именем параметра, передаваемого панелью управления в сессию.

Если в шаблоне конфигурационная строка будет содержать переменную, которой нет в сессии, то эта строка будет проигнорирована. Рассмотрим пример, в котором шаблонизатор создаст секцию VirtualHost, для конфигурационного файла Apache. В данном примере мы будем использовать переменную *{%$LISTEN_ON %}*, которая хранит в себе адрес и порт: 192.168.0.1:80.

<VirtualHost {% $LISTEN_ON %}>
</VirtualHost>

В результате, в конфигурационном файле будет создана секция VirtualHost, если её не было:

<VirtualHost 192.168.0.1:80>
</VirtualHost>

Условия

Условия — это основной инструмент выбора. Проще говоря, он выбирает, какой параметр нужно добавить, а какой удалить, в зависимости от значения переменных в момент проверки условия. Условия должны начинаться с инструкции if и заканчиваться инструкцией endif. Для начала рассмотрим простое условие, состоящее из одной инструкции if.

{% if $VARIABLE_NAME == VALUE %}
    ParameterName ParameterValue;
{% endif %}

Если результат данного условия будет истинным, тогда каждый параметр, размещенный между инструкциями if и endif, будет добавлен в конфигурационный файл, если, добавляемый параметр, в нём отсутствует. Если результат будет ложным, тогда каждый параметр, размещенный между инструкцией if и endif, будет удален из конфигурационного файла.

Расширенные условия

Простое условие может быть расширено инструкцией else. Параметры размещенные между инструкциями else и endif будут добавлены в конфигурационный файл, если результат инструкции if — ложь; или удалены из конфигурационного файла, если результат инструкции if — истина. Рассмотрим пример в котором, в зависимости от используемой версии веб-сервера Apache, необходимо добавить или удалить параметр:


<VirtualHost {% $LISTEN_ON %}>
{% if $APACHEITK == ON %}
    AssignUserID owner group
{% else %}
    SuexecUserGroup owner group
{% endif %}
</VirtualHost>

В результате, в конфигурационном файле будет создана секция VirtualHost, если ее не было, и если используется ApacheITK, в секцию VirtualHost будет добавлен параметр AssignUserID owner group, а параметр SuexecUserGroup owner group будет удален из секции VirtualHost, если он присутствовал в этой секции. Ниже показано какие параметры будет содержать конфигурационный файл, если используется ApacheITK:

<VirtualHost 192.168.0.1:80>
    AssignUserID owner group
</VirtualHost>

Если используется другая версия Apache, то конфигурационный файл будет содержать следующие параметры:

<VirtualHost 192.168.0.1:80>
    SuexecUserGroup owner group
</VirtualHost>


Условия множественного выбора

Условие может быть расширено до множественного выбора с помощью инструкции elif. Подобная конструкция может использоваться в ситуации, когда одна переменная может иметь разные значения и все необходимо обработать. Например, при создании или редактировании веб-домена ISPmanager дает возможность выбрать режим работы PHP. В качестве примера рассмотрим ситуацию с выбором режима PHP. Предположим, что у нас уже был создан веб-домен с режимом работы PHP как модуль Apache. Наш текущий конфигурационный файл имеет следующий вид:


<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
    ServerAlias www.domain.ru
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
</VirtualHost>

Отредактировав параметры веб-домена мы установили режим работы PHP как CGI. Шаблон, представленный ниже, отвечает за добавление или удаление подсекций FilesMatch относительно выбранного режима работы PHP.

<VirtualHost {% $LISTEN_ON %}>
{% if $PHP_MODE == MODULE_APACHE %}
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
{% elif $PHP_MODE == CGI %}
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php5
    </FilesMatch>
{% endif %}
</VirtualHost>

В результате, в конфигурационном файле не будет создано секции VirtualHost, т.к. она уже присутствует, все изменения произойдут в существующей секции VirtualHost. Из условия нашего примера результат инструкции if будет ложный, а значит все параметры, размещенные между инструкциями if и elif, будут удалены из секции VirtualHost. Параметры, размещенные между elif и endif, будут добавлены в секцию VirtualHost. В конечном итоге конфигурационный файл будет иметь вид:

<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
    ServerAlias www.domain.ru
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php5
    </FilesMatch>
</VirtualHost>

Таблица операторов сравнения

Ниже приведенные операторы сравнения, которые могут использоваться в условиях.


Оператор

Описание

==

Равенство. Условие верно, если два операнда равны

!=

Неравенство. Условие верно, если два операнда неравны

>

Больше. Условие верно, если первый операнд больше второго

<

Меньше. Условие верно, если первый операнд меньше второго

Комментирование строк

С помощью символов *{#}* можно комментировать строки в шаблоне конфигурационного файла. Все, что записано после знака комментария будет проигнорировано шаблонизатором. Например:


<VirtualHost {% $LISTEN_ON %}>
    ServerName {% $NAME %} {#} Комментарий
    {#} ServerAlias {% $ALIASES %}
</VirtualHost>

После обработки шаблона конфигурационный файл будет иметь вид:

<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
</VirtualHost>

Импортирование шаблона

В шаблон конфигурационного файла могут быть импортированы другие шаблоны. Импортировать шаблон можно с помощью конструкции import. Например:

<VirtualHost {% $LISTEN_ON %}>
    {% import /path/to/template/apache-params.template %}
</VirtualHost>

Путь до импортируемого шаблона должен быть абсолютный.

Параметры идентифицирующие секции


Для каждого типа конфигурационных файлов определены параметры, благодаря которым шаблонизатор идентифицирует секции. Например, для конфигурационного файла Nginx в качестве ключевых параметров выбраны server_name и ssl. Т.е. когда необходимо что-то добавить или удалить из конфигурационного файла, шаблонизатор точно знает, в какой именно секции нужно выполнить действия. Однако, если попытаться изменить эти параметры, в конфигурационном файле, в обход панели управления, то появляется вероятность, что изменения не попадут в ожидаемую секцию, а будут применены в новой секции.

Поиск измененного параметра по ключевым значениям


Существует дополнительная пара тегов — [%* и *%]. В них могут быть записаны только переменные, например [% $VARIABLE_NAME %]. Данное выражение интерпретируется как обычная переменная, однако для него выделена отдельная роль в поиске параметра. Эти теги определяют значения, которые не будут участвовать в поиске параметра. Для примера предположим, что конфигурационный файл нашего веб-домена имеет следующий вид:

<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
    ServerAlias www.domain.ru
</VirtualHost>

Для работы со страницей ошибки используем шаблон:

<VirtualHost {% $LISTEN_ON %}>
{% if $ERROR == on %}
    ErrorDocument {% $CODE %} [% $URI %]
{% endif %}
</VirtualHost>

Если значение переменной $ERROR будет равно on, тогда в секцию VirtualHost будет добавлен параметр ErrorDocument со значениями переменных $CODE и $URI. Значения $CODE и $URI задаются в панели управления, на форме создания страницы ошибки. В процессе создания страницы ошибки переменная $ERROR принимает значение on, следовательно условие выполнилось и наш конфигурационный файл имеет следующий вид:

<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
    ServerAlias www.domain.ru
    ErrorDocument 404 /404.php
</VirtualHost>

Далее, мы решили самостоятельно изменить в конфигурационном файле путь /404.php на /404.html. Наш конфигурационный файл будет иметь вид:

<VirtualHost 192.168.0.1:80>
    ServerName domain.ru
    ServerAlias www.domain.ru
    ErrorDocument 404 /404.html
</VirtualHost>

В таком виде параметр ErrorDocument существенно отличается от того, что у нас записано в панели управления. Если мы решим удалить страницу ошибки из панели управления, то шаблонизатор не сможет найти нужный параметр в конфигурационном файле и удалить его. Но так как в шаблоне значение $URI отмечено как незначащее, то для поиска будет использована строка ErrorDocument 404. В процессе удаления страницы-ошибки переменная $ERROR принимает значение off, следовательно условие, используемое в шаблоне, не выполнится. Для поиска нашего параметра будет использована не полная строка, а её часть — ErrorDocument 404, что поможет найти параметр в конфигурационном файле и удалить его.

Список стандартных переменных


Каждая вызванная функция использует свой набор параметров, которые передаются в сессию. Ниже мы рассмотрим для каждой функции управления WWW-доменом список стандартных переменных.

Создание/Изменение WWW-домена

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

Имя переменной

Описание переменной

Основные параметры WWW-домена

$NAME

Имя WWW-домена

$ALIASES

Псевдонимы WWW-домена

$DOCROOT

Корневая директория

$HOME

Домашняя директория владельца WWW-домена

$OWNER

Владелец WWW-домена

$OWNER_GROUP

Группа владельца WWW-домена

$UID

UID владельца WWW-домена

$GID

GID владельца WWW-домена

$USER_PRESET

Шаблон по которому был создан владелец WWW-домена
$RESELLER_NAMEИмя реселлера
$RESELLER_PRESETШаблон по которому был создан реселлер

$IPADDRS

Прослушиваемые IP-адреса

$LISTEN_ON

Прослушиваемые IP-адреса и порт

$EMAIL

E-Mail администратора

$CHARSET

Кодировка

$DIRINDEX

Индексная страница

$SSL

WWW-домен использует защищенное соединение. Имеет значения:

  • on — используется
  • off — не используется

$REDIRECT_HTTP

Перенаправлять HTTP-запросы в HTTPS. Имеет значения:

  • on — перенаправлять
  • off — не перенаправлять

$SSL_PORT

Прослушиваемый порт защищенного соединения

$LISTEN_ON_SSL

Прослушиваемые IP-адреса и порт защищенного соединения

$SSL_CRT

Путь до SSL сертификата

$SSL_KEY

Путь до SSL ключа

$HSTS

Используется повышенная безопасность SSL. Имеет значения:

  • on — используется
  • off — не используется

$SSL_SECURE_PROTOCOLS

Используемые SSL протоколы

$SSL_SECURE_CHIPHERS

Используемый набор криптографических алгоритмов

$SSI

Включена обработка SSI web-сервером. Имеет значения:

  • on — включена
  • off— выключена

$FOREGROUND

Текущий WWW-домен является приоритетным. Имеет значения:

  • on — является приоритетным
  • off — не является приоритетным

Журналирование

$LOG_ACCESS

Разрешено журналирование запросов к ресурсам этого WWW-домена. Имеет значения:

  • on — журналирование разрешено
  • off — журналирование запрещено

$ACCESS_LOG_PATH

Путь до лог-файла запросов к ресурсам

$LOG_ERROR

Разрешено журналирование ошибок, возникающих при обработке запросов к ресурсам этого WWW-домена. Имеет значения:

  • on — журналирование разрешено
  • off — журналирование запрещено

$ERROR_LOG_PATH

Путь до лог-файла ошибок

$ROTATION_PERIOD

Период ротации. Имеет значения:

  • every_day — ежедневно
  • every_week — еженедельно
  • every_month — ежемесячно
  • by_size — по размеру

$ROTATION_COUNT

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

$ANALYZER

Использовать генератор отчетов. Имеет значения:

  • off
  • awstats
  • webalizer
    Значения зависят от установленных возможностей

$ANALYZER_PERIOD

Период генерации отчетов. Имеет значения:

  • rotate — в момент ротации
  • every_hour — каждый час
  • every_day — ежедневно
  • every_week — еженедельно
  • every_month — ежемесячно

$ANALYZER_LANG

Язык отчета

$ANALYZER_SECURE

Ограничить доступ к статистике. Имеет значения:

  • on — доступ ограничен
  • off — доступ не ограничен

$ANALYZER_PASSWD

Пароль ограничения доступа к статистике

Дополнительные возможности

$AUTOSUBDOMAIN

Используемый тип автоподдомена. Имеет значения:

  • off — отключено
  • autosubdomain_dir — в отдельной директории
  • autosubdomain_subdir — в поддиректории домена

$PHP

Разрешена обработка PHP скриптов. Имеет значения:

  • on — обработка разрешена
  • off — обработка не разрешена

$PHP_MODE

Режим работы PHP

$PHP_NATIVE_VERSION

Используемая версия PHP


Переменные веб-сервера Apache

Имя переменной

Описание переменной

$LISTEN_ON

Прослушиваемые IP-адреса и порт

$APACHEITK

В роли веб-сервера используется Apache ITK. Имеет значения:

  • on — используется Apache ITK
  • off — используется другая версия веб-сервера

$CGI

Разрешено исполнение CGI-скриптов. Имеет значения:

  • on — Исполнение разрешено
  • off — Исполнение запрещено

$CGI_EXT

Дополнительные расширения файлов CGI-скриптов

$CGI_EXT_PATH

Путь до директории cgi-bin

$INCLUDEПуть до конфигурационного файла пользовательских ресурсов WWW-домена
$INCLUDE_PHPПуть до конфигурационного файла пользовательских ресурсов WWW-домена (для режима PHP как модуль Apache)

$SSL_BUNDLE

Цепочка SSL сертификатов включающая корневой и промежуточный сертификаты. Параметр доступен только если веб-сервер Apache работает в режиме фронтэнда (Nginx не установлен)

Переменные веб-сервера Nginx

Имя переменной

Описание переменной

$NGINX_LISTEN_ON

Прослушиваемые IP-адреса и порт

$NO_TRAFF_COUNT

Включена статистика по трафику. Имеет значения:

  • on — включена
  • off — выключена

$AUTOSUBDOMAIN_SUBDOMAIN_PART

Имя корневой директории домена

$USER_NGINX_RESOURCES_PATHПуть до конфигурационного файла пользовательских ресурсов WWW-домена

$NGINX_VHOST_INCLUDES

Путь до служебных настроек Nginx

$SRV_GZIP

Используется сжатие. Имеет значения:

  • on — используется
  • off — не используется

$GZIP_LEVEL

Уровень сжатия

$SRV_CACHE

Используется кэширование. Имеет значения:

  • on — используется
  • off — не используется

$EXPIRES_VALUE

Значение периода кэширования

$WEBSTAT_LOCATION

Размещение директории со статистикой

$WEBSTAT_ENCODING

Кодировка статистики

$REDIRECT_TO_APACHE

Перенаправлять запрос к веб-серверу Apache. Имеет значения:

  • on — запрос перенаправляется

$BACKEND_BIND_URI

Адрес и порт прослушиваемый веб-сервером Apache

$REDIRECT_TO_PHPFPM

Используется режим работы PHP как FastCGI (Nginx + PHP-FPM). Имеет значения:

  • on — используется режим FastCGI (Nginx + PHP-FPM)
  • В других случаях переменная не устанавливается

Значение устанавливается в режиме работы PHP как FastCGI (Nginx + PHP-FPM)

$PHPFPM_USER_SOCKET_PATH

Путь до unix сокета

Значение устанавливается в режиме работы PHP как FastCGI (Nginx + PHP-FPM)

$DDOSSHIELD

Включена защита от DDoS-атаки. Имеет значения:

  • on — включена
  • off— выключена

$NGINX_LIMITREQUEST

Количество запросов в секунду

$NGINX_BURSTREQUEST

Максимальный размер всплеска

$SSL_CRT_BUNDLE_PATH

Путь до файла, включающего сам SSL-сертификат, а также соответствующую цепочку сертификатов

Страницы ошибок

Имя переменной

Описание переменной

$NAME

Имя WWW-домена

$ALIASES

Псевдонимы WWW-домена

$OWNER

Владелец WWW-домена

$LISTEN_ON

Прослушиваемые IP-адреса и порт

$SSL

WWW-домен использует защищенное соединение. Имеет значения:

  • on — использует защищенное соединение
  • off— не использует защищенное соединение

$LISTEN_ON_SSL

Прослушиваемые IP-адреса и порт защищенного соединения

$ERROR

Имеет значения:

  • on — если страница ошибки создается или редактируется
  • off— страница ошибки удаляется

$CODE

Код ошибки, к которому будет привязан URI страницы

$URI

Адрес страницы, которая будет отдаваться при возникновении ошибки

Редиректы

Имя переменной

Описание переменной

$NAME

Имя WWW-домена

$ALIASES

Псевдонимы WWW-домена

$OWNER

Владелец WWW-домена

$LISTEN_ON

Прослушиваемые IP-адреса и порт

$SSL

WWW-домен использует защищенное соединение. Имеет значения:

  • on — использует защищенное соединение
  • off— не использует защищенное соединение

$LISTEN_ON_SSL

Прослушиваемые IP-адреса и порт защищенного соединения

$REDIRECT

Имеет значения:

  • on — перенаправление создается или редактируется
  • off— редирект удаляется

$PATH

Относительный путь, который будет перенаправляться на другой URL

$URL

URL, на который будет выполняться перенаправление

$FLAG

Флаг прекращения обработки директив. Имеет значение:

  • permanent
  • redirect
  • last

Параметр имеет значения только при обработке шаблона nginx-rewrite.template

Доступ

Имя переменной

Описание переменной

$NAME

Имя WWW-домена

$ALIASES

Псевдонимы WWW-домена

$OWNER

Владелец WWW-домена

$SSL

WWW-домен использует защищенное соединение. Имеет значения:

  • on — использует защищенное соединение
  • off— не использует защищенное соединение

$LOCATION_PATH

Относительный путь к директории для которой устанавливается ограничение доступа

$ACCESS

Имеет значения:

  • on — ограничение доступа создается
  • off— ограничение доступа удаляется

$AUTH_FILE

Файл, в котором хранятся имена и пароли пользователей

$AUTH_REALM

Название диалогового окна авторизации

Параметр устанавливается только при обработке шаблона apache-access.template

Набор параметров на вашем сервере может отличаться от приведенного выше, в зависимости от активированных возможностей, установленных плагинов и т.д. Актуальный набор параметров, для вызванной функции, вы всегда можете узнать в лог-файле панели управления /usr/local/mgr5/var/ispmgr.log. Вызов функции, в лог-файле, обозначен зеленым цветом. Также переданные параметры можно посмотреть в консоли вашего веб-браузера, после отправки формы на сервер.

Пример использования

Рассмотрим ситуацию, когда в зависимости от типа шаблона учетной записи, по которому был создан пользователь, необходимо сгенерировать разные параметры конфигурационного файла. В примере будет всего два типа шаблона учетных записей: для пользователей CMS «1C-Bitrix» и веб-фреймворка «Django». Для начала создадим шаблоны учетных записей. В ISPmanager Lite перейдем в модуль «Шаблоны», расположенный в разделе меню «Настройки» и создадим новый шаблон учетной записи с названием «Bitrix». Параметры «Ограничения» могут быть выставлены произвольным образом, в разделе «Доступ» установим параметр Может использовать PHP как модуль apache, кодировку домена установим UTF-8 и Тип обработчика PHP как модуль Apache. Далее создадим шаблон учетной записи для Django. В качестве названия пишем Django, ограничения и доступы могут быть выставлены произвольным образом, раздел «Значения по умолчанию» устанавливаем по аналогии с предыдущим шаблоном.


Для работы сайта под управлением CMS «1С-Bitrix» достаточно в шаблоне apache2-vhost.template определить дополнительные параметры, однако для работы сайта под управлением веб-фреймворка Django необходимо установить модуль «mod_wsgi» для Apache. Для Linux дистрибутива Debian данный модуль устанавливается командной:


# apt-get install libapache2-mod-wsgi


Для Linux дистрибутива CentOS данный модуль устанавливается командной:


# yum install mod_wsgi


Также для обработки запросов нам понадобится интерфейс к модулю «mod_wsgi». Исходный код интерфейса можно найти на ресурсах посвященных веб-фреймворку «Django». В данном пример определим только имя интерфейса — django.wsgi, который нужно будет расположить в корневой директории веб-домена.


Теперь нужно подготовить шаблон конфигурационного файла. Скопируем шаблон */usr/local/mgr5/etc/templates/default/apache2-vhosts.template* в директорию */usr/local/mgr5/etc/templates/* и добавим в конец секции *<VirtualHost {% $LISTEN_ON %}>* параметры:

{% if $USER_PRESET == Bitrix %}
    php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8
    php_admin_value opcache.revalidate_freq 0
    php_admin_value display_errors on
{% elif $USER_PRESET == Django %}
    WSGIScriptAlias / {% $DOCROOT %}/django.wsgi
    WSGIDaemonProcess [% $NAME %] processes=2 maximum-requests=5 threads=1
    WSGIProcessGroup {% $NAME %}
{% endif %}

В итоге шаблон секции VirtualHost будет выглядеть таким образом:

<VirtualHost {% $LISTEN_ON %}>
	ServerName {% $NAME %}
	ServerAlias {% $ALIASES %}
	DocumentRoot {% $DOCROOT %}
	ServerAdmin {% $EMAIL %}
	DirectoryIndex {% $DIRINDEX %}
	AddDefaultCharset {% $CHARSET %}
{% if $APACHEITK == on %}
	AssignUserID {% $OWNER %} {% $OWNER_GROUP %}
{% else %}
	SuexecUserGroup {% $OWNER %} {% $OWNER_GROUP %}
{% endif %}
{% if $LOG_ACCESS == on %}
	CustomLog {% $ACCESS_LOG_PATH %} combined
{% else %}
	CustomLog /dev/null combined
{% endif %}
{% if $LOG_ERROR == on %}
	ErrorLog {% $ERROR_LOG_PATH %}
{% else %}
	ErrorLog /dev/null
{% endif %}
{% if $CGI == on %}
	ScriptAlias /cgi-bin/ {% $CGI_EXT_PATH %}
{% endif %}
{% if $INCLUDE %}
	Include {% $INCLUDE %}
{% endif %}
{% if $PHP == on and $FILES_MATCH == on %}
	<FilesMatch "\.ph(p[3-5]?|tml)$">
		SetHandler {% $PHP_HANDLER %}
{% if $APACHE_FCGID == on %}
		FCGIWrapper {% $PHP_BIN_WRAPPER %}
		Options ExecCGI
{% endif %}
	</FilesMatch>
{% endif %}
{% if $PHP_MODE == php_mode_mod %}
	<FilesMatch "\.phps$">
		SetHandler application/x-httpd-php-source
	</FilesMatch>
{% if $INCLUDE_PHP %}
	Include {% $INCLUDE_PHP %}
{% endif %}
	php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f {% $EMAIL %}"
	php_admin_value upload_tmp_dir "{% $MOD_TMP_PATH %}"
	php_admin_value session.save_path "{% $MOD_TMP_PATH %}"
{% if $OPEN_BASEDIR != / %}
	php_admin_value open_basedir "{% $OPEN_BASEDIR %}"
{% endif %}
{% elif $PHP_MODE == php_mode_cgi %}
	ScriptAlias /php-bin/ {% $PHP_BIN_DIR %}
	AddHandler application/x-httpd-php5 .php .php3 .php4 .php5 .phtml
	Action application/x-httpd-php5 /php-bin/php
{% elif $PHP_MODE == php_mode_fcgi_apache and $APACHE_FCGID != on %}
	AddType application/x-httpd-fastphp .php .php3 .php4 .php5 .phtml
	Alias /php-fcgi/ {% $PHP_BIN_DIR %}
{% endif %}
{% if $VIRTUAL_DOCROOT == on %}
	VirtualDocumentRoot {% $VIRTUAL_DOCROOT_PATH %}
{% endif %}
{% if $USER_PRESET == Bitrix %}
    php_admin_value mbstring.func_overload 2
    php_admin_value mbstring.internal_encoding UTF-8
    php_admin_value opcache.revalidate_freq 0
    php_admin_value display_errors on
{% elif $USER_PRESET == Django %}
    WSGIScriptAlias / {% $DOCROOT %}/django.wsgi
    WSGIDaemonProcess [% $NAME %] processes=2 maximum-requests=5 threads=1
    WSGIProcessGroup {% $NAME %}
{% endif %}
</VirtualHost>

Теперь при создании веб-домена, в зависимости от того по какому шаблону учетных записей создан пользователь, будут генерироваться конфигурационные данные для использования CMS «1C-Bitrix» или веб-фреймворка «Django».