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

17

В моих файлах 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. Там было предположение здесь , что это произошло потому , что некоторые конфигурации сценарий не заменит окр правильно варов в моем файле apache2.conf. Независимо от того, как я могу получить apache2 для просмотра моего файла envvars?

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

Эйвери Чан
источник

Ответы:

30

Посмотрев на ответ, данный @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 за то, что указал мне правильное направление.

Эйвери Чан
источник
Еще более правильный путь будет с помощью сценария инициализации: sudo stop apache2, sudo restart apache2и sudo start apache2( /etc/init.d/apache2 stopи т.д.)
Lekensteyn
В моем случае я добавлял umaskпараметр в envvars, и даже после перезапуска с использованием apache2ctl restartон все еще не работал, но перезапуск с использованием service apache2 restartработал ( service apache2 gracefulне).
Мэтт Браун
Рекомендуется использовать службу вместо apachectl, но если вам нужно использовать команды, не связанные с командой service, такие как apachectl -S ... этот ответ отличный. upvote
Фейда Кила
К вашему сведению: если /etc/init.d apache2 reloadвы не получите envvarsдополнения, вы должны остановить и запустить сервер
ThaDon
7

С http://httpd.apache.org/docs/2.2/configuring.html :

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

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

In /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

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

Lekensteyn
источник
Я выполнил проверку и могу убедиться, что мои envvars не содержат синтаксических ошибок. Я нашел решение; см. мой ответ ниже.
Эйвери Чан