Почему apache2 не уважает мой файл envvars?

В моих файлах envvar есть следующие строки:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

В моем apache2.conf есть следующие строки:

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Но когда я запускаю apache2 -M, я получаю это :

apache2: bad user name ${APACHE_RUN_USER}

Временное исправление - жестко запрограммировать www-data в мой файл apache2.conf. Были некоторые предположения здесь , что это произошло из-за того, что какой-то конфигурационный скрипт неправильно заменил переменные env в моем файле apache2.conf. Независимо от того, как я могу заставить apache2 обращаться к моему файлу envvars?

Как еще одна точка данных , этот сайт , похоже, указывает, что envvars генерируется при сборке, но читается apache2ctl во время выполнения, предполагая, что этот файл не является просто остатком процесса сборки.

17
задан 13 April 2017 в 15:24

2 ответа

Из http://httpd.apache.org/docs/2.2/configuring.html :

Значения переменных среды оболочки могут использоваться в строках файла конфигурации. используя синтаксис $ {ENVVAR}. Если «ENVVAR» - это имя допустимой переменной среды, значение этой переменной подставляется в это место в строке файла конфигурации, и обработка продолжается, как если бы этот текст был найден непосредственно в файле конфигурации. (Если переменная ENVVAR не найдена, символы "$ {ENVVAR}" остаются неизменными для использования на более поздних этапах обработки файла конфигурации.)

Таким образом, переменная действительно извлекается из окружающая среда, как и ожидалось. Теперь, где это происходит?

В /etc/init.d/apache2 для APACHE_ENVVARS задан путь к файлу envvars, который основан на пути initscript. Обычно это приводит к установке APACHE_ENVVARS=/etc/apache2/envvars. Теперь, поскольку это значение равно значениям по умолчанию, установленным в apache2ctl, оно не экспортируется.

Из /usr/sbin/apache2ctl:

# the path to the environment variable file
test -z "$APACHE_ENVVARS" && APACHE_ENVVARS="$APACHE_CONFDIR/envvars"
# pick up any necessary environment variables
if test -f $APACHE_ENVVARS; then
  . $APACHE_ENVVARS
fi

Объяснение: если APACHE_ENVVARS пусто, используйте путь по умолчанию /etc/apache2/envvars. Если этот файл существует, «отправьте» его (выполните команды из этого файла в текущей среде).

Убедитесь, что файл envvars не содержит синтаксических ошибок. Чтобы выполнить такую ​​проверку, используйте:

sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL

Ошибки напечатаны, если таковые имеются.

0
ответ дан 13 April 2017 в 15:24

После просмотра ответа, данного @Lekensteyn, я попытался sudo apache2ctl -M с моим apache2.conf, возвращенным к оригиналу. Это сработало, поэтому я немного покопался в man-страницах. Вот что man apache2 должен был сказать:

In  general, apache2 should not be invoked directly, but rather should 
be invoked via /etc/init.d/apache2 or apache2ctl. The default Debian 
configuration requires environment variables that are defined in 
/etc/apache2/envvars  and  are  not  available  if  apache2  is  
started  directly. However, apache2ctl can be used to pass arbitrary 
arguments to apache2.

Итак, ответ на этот вопрос: Вы не используете apache2 правильно; используйте вместо этого apache2ctl.

Спасибо @Lekensteyn за то, что указал мне правильное направление.

0
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: