我有一个包含以下内容的 httpd.conf 文件:
<IfModule unixd_module>
<If "env('OS') == 'Darwin'">
User daemon
Group admin
</If>
<Else>
User www
Group scm
</Else>
</IfModule>
Run Code Online (Sandbox Code Playgroud)
我想要做的是将我在 OSX 上的开发环境中的 httpd 实例的用户 ID 设置为一个用户,但在部署到 Ubuntu 时设置为另一个用户。我收到一条语法错误消息:
AH00526: Syntax error on line 32 of /usr/local/apps/apache2/conf/httpd.conf:
User not allowed here
Run Code Online (Sandbox Code Playgroud)
我查看了If指令,这里是允许的。如果我注释掉用户/组,我不会收到语法错误。没有 IF/Else,并且只使用一个用户,这有效。如果我尝试对用户/组使用该条件,则会收到错误消息。这可能在 httpd.conf 中吗?如果是,那又如何?有没有不同的方法来完成同样的事情?“OS”环境变量在每个环境中设置为“export OS= uname”。这是在 Apache httpd 2.4.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
Run Code Online (Sandbox Code Playgroud)
它由/etc/init.d/apache2启动脚本提供/继承,因此在httpd主配置文件(例如apache2.conf)中可以使用以下部分
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
Run Code Online (Sandbox Code Playgroud)
简单修改 /etc/apache2/envvars 就可以让你得到你需要的东西。您还可以在 OSX 上使用的用户/组的编译设置中更改用户/组的一些默认值,并仅在 Ubuntu 端使用该脚本。
| 归档时间: |
|
| 查看次数: |
21015 次 |
| 最近记录: |