关于webserver:Apache httpd.conf 用户/组设置

Apache httpd.conf User/Group Setting

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

1
2
3
4
5
6
7
8
9
10
<IfModule unixd_module>
<If"env('OS') == 'Darwin'">
    User daemon
    Group admin
</If>
<Else>
    User www
    Group scm
</Else>
</IfModule>

我正在尝试将我在 OSX 上的开发环境中的 httpd 实例的用户 ID 设置为一个用户,但在将其部署到 Ubuntu 时设置为另一个用户。我收到一条语法错误消息:

1
2
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.


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

因为"用户"和"组"应该为整个安装设置一次,而不是被".htaccess"修改或取决于目录/位置上下文,因此它们不在某些默认的"AllowOverride"上列表,并且您不能简单地将其放入这样的上下文中以使其可覆盖。不过,强制用户/组选项仅在 apache 内部"配置树"之上有效是有道理的。

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

简而言之,有 /etc/apache2/envvars 文件包含例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)中可以使用以下部分

1
2
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

对 /etc/apache2/envvars 的简单修改将让你得到你需要的东西。您还可以在 OSX 上使用的用户/组的编译设置中更改用户/组的一些默认值,并仅在 Ubuntu 端使用脚本。