Apache httpd.conf用户/组设置

时间:2013-06-13 20:42:23

标签: apache webserver

我有一个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指令,这是允许的。如果我注释掉用户/组我没有得到语法错误。没有IF / Else,只使用一个用户,这是有效的。如果我尝试使用用户/组的条件,我收到错误。这可能在httpd.conf中吗?如果是这样,那怎么样?有没有不同的方法来完成同样的事情? “OS”环境变量在每个环境中设置为“export OS = uname”。这是在Apache httpd 2.4.4。

1 个答案:

答案 0 :(得分:4)

我终于找到了一个更深入地检查它的时刻,这是因为覆盖行为。我已经用2.4.4源代码进行了简要检查,在我看来,基本上只有当前目录或位置上下文中“覆盖”列表中的指令可以用If / Else覆盖。

由于“用户”和“组”应该为整个安装设置一次,而不是由“.htaccess”修改或根据目录/位置上下文修改,因此它们不是默认的“AllowOverride”列表,你不能简单地把它放到这样的上下文中,使它们可以覆盖。但有意义的是,强制用户/组选项仅在apache内部“配置树”之上有效。

要以合理的方式实现您需要的行为,正如我在评论中稍后解释的那样,您应该使用“envvars”机制,默认情况下在Debian中可用(也可能是Ubuntu)。

简而言之,有/ 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端使用该脚本。