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-dataapache2.conf文件硬编码到其中。有一些猜测在这里,这是因为一些配置脚本并没有取代ENV在我的apache2.conf文件正确瓦尔。无论如何获取apache2来查询我的envvars文件?

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

Answers:


30

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


在更正确的方法是使用启动脚本:sudo stop apache2sudo restart apache2sudo start apache2/etc/init.d/apache2 stop等)
Lekensteyn

就我而言,我正在向umaskenvvars 添加一个设置,即使使用apache2ctl restart它重新启动后仍然无法正常工作,但是使用dodvar重新启动service apache2 restart确实可行(service apache2 graceful没有)。
马特·布朗

建议使用服务而不是apachectl,但是如果您需要使用未链接到服务命令的命令,例如apachectl -S ...,此答案很好。upvote
Feida Kila

仅供参考:这样做/etc/init.d apache2 reload不会获取envvars附加信息,您必须停止并启动服务器
ThaDon 2014年

7

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

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

因此,确实确实可以从环境中检索变量。现在这发生在哪里?

在中/etc/init.d/apache2APACHE_ENVVARS被设置envvars为基于初始化脚本路径的文件的路径。通常会导致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

如果有错误,将打印出来。


我执行了检查,可以验证我的envvars是否不包含任何语法错误。我找到了解决方案;请参阅下面的答案。
艾利·陈
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.