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 扩展,您可能会收到“DocumentRoot must be a directory”错误,即使它确实是一个目录。运行 system-config-securitylevel(或 redhat-config-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
Mac自带apache2搭建服务请求localhost报 403 Forbidden