Apache httpd.conf 用户/组设置

5

我有一个httpd.conf文件,其中包含以下内容:

<IfModule unixd_module>
<If "env('OS') == 'Darwin'">
    User daemon
    Group admin
</If>
<Else>
    User www
    Group scm
</Else>
</IfModule>

我想做的是在我的OSX开发环境中为httpd实例设置用户ID,但在部署到Ubuntu时为不同的用户。我收到一个语法错误消息:

AH00526: Syntax error on line 32 of /usr/local/apps/apache2/conf/httpd.conf:
User not allowed here

我查看了If指令,它在此处是允许的。如果我注释掉User/Group,就不会出现语法错误。只使用一个用户,没有IF / Else,这可以工作。如果我尝试使用带有用户/组的条件,则会收到错误。这在httpd.conf中可能吗?如果是这样,那么怎么做?是否有不同的方法来完成相同的事情?每个环境中都使用"export OS=uname"设置“OS”环境变量。这是在Apache httpd 2.4.4中实现的。

不确定2.4.4版本是否可行,但难道没有其他方法可以实现你想要的吗?如果有疑问,请查看源代码中如何执行语法检查,这就是我会做的。可能User/Group或If/Else不能一起使用,或者它的行为与预期不同,即存在错误。我记得在Debian和以前的Apache版本中还有另一种方法,即从调用脚本(通常是init.d脚本)中使用shell变量$APACHEUSER和$APACHEGROUP,这些变量来自/etc/default/apache2文件。问题可能应该移动到superuser.com,因为它与编程无关。 - Piotr Wadas
1个回答

5
我终于找到时间深入检查了一下,原因是覆盖行为。我已经简要检查了2.4.4源代码,并且在当前目录或位置上下文中仅有“覆盖”列表中的指令才能使用If/Else进行覆盖。
由于“User”和“Group”应该在整个安装过程中设置一次,而不是通过“.htaccess”或依赖于Directory/Location上下文进行修改,因此它们不在某些默认的“AllowOverride”列表中,您不能仅仅将其放入这样的上下文中使其可覆盖。但是强制用户/组选项仅在apache内部“配置树”的顶部有效是有意义的。
为了以合理的方式实现所需的行为,如我在我的评论中简要解释的那样,您应该使用Debian(可能也适用于Ubuntu)默认提供的“envvars”机制。
简而言之,“/etc/apache2/envvars”文件包含例如:
unset HOME
if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then
    SUFFIX="-${APACHE_CONFDIR##/etc/apache2-}"
else
    SUFFIX=
fi
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2/apache2$SUFFIX.pid
export APACHE_RUN_DIR=/var/run/apache2$SUFFIX
export APACHE_LOCK_DIR=/var/lock/apache2$SUFFIX
export APACHE_LOG_DIR=/var/log/apache2$SUFFIX
export LANG=C
export LANG

这段内容是由/etc/init.d/apache2启动脚本继承的,在httpd主配置文件(例如apache2.conf)中,可以使用以下部分:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

简单修改 /etc/apache2/envvars 即可获得您所需的内容。您还可以更改在 OSX 上使用的用户/组编译设置的一些默认值,并仅在 Ubuntu 端使用脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接