Назад | Перейти на главную страницу

Напишите конфигурацию apache с условием, основанным на версии apache

Я хочу написать конфигурацию для сервера apache, который должен работать с apache-2.2 и -2.4 без изменений. Поскольку в v2.4 есть несколько новых модулей, которые необходимо загрузить, и несколько измененных директив, мне понадобятся некоторые условные операторы. Я бы хотел что-то вроде

<If ApacheVersion >= 2.4>
  LoadModule mod_only_in_2.4.so
</If>

но я еще не нашел правильного выражения. Может ли кто-нибудь указать мне правильное направление?

Разъяснение моих мотивов: я разрабатываю сервер, который я хочу просто скопировать на сервер и запустить без дальнейшей настройки, зависящей от хоста. И поскольку на машинах может быть любая версия apache, мне нужна конфигурация, которая работает в обоих случаях.

Вы должны проверять модуль, а не версию Apache.

Например:

<IfModule mod_authz_core.c>
Require all granted
</IfModule>

<IfModule !mod_authz_core.c>
Order deny,allow
Allow from all
</IfModule>

Обратите внимание, что вы не можете заранее угадать, есть ли у кого-то конкретная версия Apache; Системный администратор должен убедиться, что загружаются правильные модули. Все, о чем вам, как разработчику, действительно нужно беспокоиться, это то, что вы предоставляете правильные директивы, в зависимости от того, какие модули доступны.

Как системному администратору вам придется поддерживать разные конфигурации для Apache 2.2 и 2.4; нет никакого способа обойти это. К счастью, каждая система управления конфигурацией делает это относительно легко, и если вы еще не используете такую ​​систему, вы должны это сделать.

Если mod_version загружен, который должен быть доступен по умолчанию (хотя и не загружен по умолчанию) как в Apache 2.2, так и в 2.4, вы можете использовать <IfVersion> директива для проверки версии Apache (и только Apache):

<IfVersion >= 2.3>
    # this happens only in versions greater or
    # equal 2.3.0.
</IfVersion>

Пример взят из документации.

Вот что я в итоге сделал: я отредактировал свой стартовый скрипт, чтобы установить переменную, определяющую версию apache

apache_version_string=`$apache_bin -v|grep -oP "Apache/(\d\.\d)"`
if [[ $apache_version_string == "Apache/2.2" ]]; then
    server_flags=$server_flags" -DAPACHEv22"
 else
    if [[ $apache_version_string == "Apache/2.4" ]]; then
        server_flags=$server_flags" -DAPACHEv24"
    fi
fi

и в конфигурации apache я проверил эти определения

<IfDefine APACHEv24>
  LoadModule authz_core_module        /usr/lib/apache2/mod_authz_core.so
</IfDefine>