为什么 apache2 不尊重我的 envvars 文件?

为什么 apache2 不尊重我的 envvars 文件?

我的环境变量文件中有以下几行:

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}

一个临时的解决办法是将我的 apache2.conf 文件硬编码www-data到其中。有人猜测这里这是因为某些配置脚本没有正确替换我的 apache2.conf 文件中的环境变量。无论如何我如何让 apache2 查阅我的 envvars 文件?

作为另一个数据点本网站似乎表明 envvars 是在构建时生成的,但在运行时由 apache2ctl 读取,这表明该文件不仅仅是构建过程留下的垃圾。

答案1

在查看了 @Lekensteyn 给出的答案后,我尝试sudo apache2ctl -M将 apache2.conf 恢复为原始版本。这很有效,所以我深入研究了一下手册页。以下是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 为我指明正确的方向。

答案2

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

可以使用语法 ${ENVVAR} 在配置文件行中使用 shell 环境变量的值。如果“ENVVAR”是有效环境变量的名称,则该变量的值将替换到配置文件行中的相应位置,并继续处理,就像在配置文件中直接找到该文本一样。(如果未找到 ENVVAR 变量,则字符“${ENVVAR}”保持不变,以供配置文件处理的后续阶段使用。)

因此,变量确实按预期从环境中检索到了。现在这发生在哪里?

在 中/etc/init.d/apache2APACHE_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。如果此文件存在,则“source”它(在当前环境中执行该文件中的命令)。

确保envvars文件不包含任何语法错误。要执行此类检查,请使用:

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

如果有错误就会打印出来。

相关内容