为什么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文件中。 这里有一些猜测,这是因为某些配置脚本没有在我的apache2.conf文件中正确替换env vars。 无论如何让apache2参考我的envvars文件?

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

在查看了@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指出我正确的方向。

来自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 

如果有错误,则打印错误。