Apache重启导致DocumentRoot必须是一个目录,即使它是一个目录并且似乎没有权限问题

Posted

技术标签:

【中文标题】Apache重启导致DocumentRoot必须是一个目录,即使它是一个目录并且似乎没有权限问题【英文标题】:Apache restart causes DocumentRoot must be a directory, even though it is a directory and there seem to be no privilege issues 【发布时间】:2013-01-25 01:31:41 【问题描述】:

我有一个几乎可以肯定是新手的问题。我希望在写这个问题时找到问题,但我仍然卡住了。

我想更改 apache 的 DocumentRoot,但我不断收到错误消息“DocumentRoot must be a directory”。

情况:

代码在虚拟 VMWare 机器 4.0.4 build-744019 中运行 linux 的版本是 Scientific Linux release 6.4 (Carbon) apache 的版本是 Apache/2.2.15 (Unix)(这是一个 yum 安装,什么都没有 特别)

在 httpd.conf 中

DocumentRoot "/home/stave/www"

当我重新启动时,我会收到消息

Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory

目前采取的步骤:

我确保目录存在:

ls -asl /home/stave
4 drwxrwxrwx.  2 stave stave    4096 Feb  9 09:08 www
It even has a file in it "index.html", so I am very sure that the directory exists

我认为这可能是一个特权问题,所以(这是一个与互联网隔离的虚拟开发机器,我正在排除故障,所以我不太担心安全性),如您所见,我将特权设置为 777。

我什至更改了运行 apache 的用户(并确认该更改适用于 ps)以确保特权不应该成为问题。

堆栈溢出

有一些堆栈溢出的答案,但大多数都说“阅读错误消息。它说该目录实际上并不存在”。其他人暗示最后可能会有一个斜杠,这会很糟糕。

其他网站

我找到的最有用的是this 建议

由于 SELinux 扩展,您可能会收到“Doc​​umentRoot must be a directory”错误,即使它确实是一个目录。运行 system-config-securitylevel(或 redhat-c​​onfig-securitylevel)为 httpd 禁用 SELinux 或授予 SELinux 权限 目录: chcon -R -h -t httpd_sys_content_t /path/to/directory*

我的 linux 版本不是 Security Enhanced Linux,所以在不理解的情况下我还是尝试了它:没有效果。

现状

我已经没有尝试的想法了,所以任何诊断问题或建议都将不胜感激

【问题讨论】:

第 292 行绝对是您正在查看的行吗? Grep 为 DocumentRoot 的整个配置,也许你错过了一个? 谢谢保罗。 Grep 在前缀中返回几个 cmets,并且有问题的行是第 292 行。(当前有问题的行指向 /var/www/html 有效)。 你试过在 strace 下启动 Apache 吗?可能会提供有关正在发生的事情的线索。 apache 是否可以访问 /home 和 /home/stave?主目录通常不是每个人都可读的。 【参考方案1】:

您在“其他网站”下发布的链接突出显示了问题的根本原因,即 Selinux。

除非服务器是超级安全环境的一部分,否则我会简单地禁用 Selinux。

在 RedHat/CentOS/Scientific Linux 上,这可以通过编辑 /etc/sysconfig/selinux 轻松完成 - 找到参数“selinux”并根据下面的摘录将选项“enforcing”更改为“disabled”:

# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - No SELinux policy is loaded.
SELINUX=disabled

进行此更改后重新启动服务器可能是明智之举。

【讨论】:

哇,我希望我早点找到这个!当我尝试在默认的/var/www/html 目录之外加载页面时,禁用 Selinux 也解决了我获取(13)Permission denied 的问题。 禁用selinux不好。 link 最好在您的 webroot 目录上设置正确的上下文,以便 apache 可以访问它。 @Cedric 有正确答案,就是setsebool -P httpd_enable_homedirs on 减一建议修复是关闭 selinux 见@Cedric 的回答。不要禁用 SELINUX【参考方案2】:

我今天也遇到了这个问题,这是因为我将 DocumentRoot 从 /var/www/html 移动到 /srv/www/html。作为我们安全策略的一部分,我们不能只选择禁用 SELinux。

所以我发现我的解决方法是更改​​ /srv 的 SELinux 文件上下文以匹配 /var。妥协是的,但仍然比完全禁用它好。除此之外...我确保 /srv/www 和所有子文件夹都有 httpd_sys_content_t 以匹配 /var/www 下的文件夹,现在一切都很好。

【讨论】:

更详细一点 - 更改文件上下文的方法是使用以下命令: chcon -R -h -t httpd_sys_content_t /path/to/directory 一旦你这样做,Apache 将能够访问/path/to/directory 并从中提供文件。【参考方案3】:

您不应该只禁用 SELinux。

您需要将 httpd_enable_homedirs 设置为开启。

yum -y install policycoreutils-python
setsebool -P httpd_enable_homedirs on

【讨论】:

这是正确的答案。谢谢@Cedric。【参考方案4】:

这与 David 的答案基本相同,但更清楚一点,http 服务目录设置了错误的 SELinux 安全上下文。

解决这个问题的完整解释在这里,http://mybroadband.co.za/vb/showthread.php/588183-Fix-403-Forbidden-on-newly-configured-CentOS-6-5-httpd-server-(or-13-10-Ubuntu-LAMP)

我的问题是我的网站位于与 /var/www/ 的文档根路径不同的目录中,因此我必须按照上面链接中的第三个选项进行更正。我将 /websites/ 目录的相同文件上下文设置为匹配 /var/www/ 的文件上下文。奇怪的是 CentOS 5.5 的早期版本一定没有安装/启用 SELinux,因为我的其他服务器对此没有任何问题,并且在命令提示符下运行 ls -Z 时将这些文件夹显示为“未标记”。

我在 AWS 上通过官方市场最小安装运行 CentOS 6.5。因此,当我在我的文件夹上运行 ls -Z 命令时,我确切地看到了上面链接显示的可能问题。

运行 chcon 命令解决了我的问题!

只需将 html/ 替换为您要使用的目录即可!

chcon -Rv --type=httpd_sys_content_t html/

chcon -Rv --user=system_u html/

顺便说一句,我还必须禁用 iptables 才能使路由正常工作,默认设置是提供空白页。

服务 iptables 停止

希望对遇到同样问题的人有所帮助。

【讨论】:

这些适用于我的特定安装。使用与默认目录不同的目录来提供网络服务,这两个特定的命令修复了它。之后一定要重启apache。【参考方案5】:

环境: Linux - SSD 上的根文件系统 硬盘上的 DocumentRoot 并通过 fstab 挂载 启动后重新启动 apache2 - 没问题 似乎是在 fstab 挂载完成之前启动 apache 的时间问题。

解决方法: 使用正确的所有者、组和权限在根文件系统上定义 DocumentRoot 目录。目录可能为空。

【讨论】:

【参考方案6】:

首先,完全没有理由关闭 selinux 来解决这个问题,只需更改 selinux 文件上下文即可。

其次,在更改 selinux 文件上下文时,您应该为该路径设置 永久 规则,这样当新文件被复制和/或替换现有文件时,restorecon 实际修复问题,而不是破坏它,就像您只使用 chcon 时的情况一样。

因此,对于符号链接的 DocumentRoot(在此示例中,我们将目录的实际完整路径指定为“/media/myDoc”),运行以下两个命令:

semanage fcontext -a -t httpd_sys_content_t "/media/myDoc(/.*)?"

restorecon -R /media/myDoc

注意,以这种方式使用 semanage 时需要完整路径。您不仅可以解决问题,而且在您以后运行restorecon(或自动重新标记)时不会再次中断。

【讨论】:

以上是关于Apache重启导致DocumentRoot必须是一个目录,即使它是一个目录并且似乎没有权限问题的主要内容,如果未能解决你的问题,请参考以下文章

添加Apache VirtualHost,localhost的DocumentRoot更改为VirtualHost的DocumentRoot

apache virtualhost(windows)不改变DocumentRoot

Apache配置命令

Mac自带apache2搭建服务请求localhost报 403 Forbidden

Mac自带apache2搭建服务请求localhost报 403 Forbidden

Mac自带apache2搭建服务请求localhost报 403 Forbidden