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

时间:2013-02-09 09:54:23

标签: apache2 apache

我几乎可以肯定是一个新手问题。我希望在写这个问题时能找到问题,但我仍然陷入困境。

我想更改Apache的DocumentRoot,但我不断收到错误消息“DocumentRoot必须是一个目录”。

情况:

  • 代码在虚拟VMWare计算机4.0.4 build-744019
  • 中运行
  • Linux的版本是Scientific Linux版本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。 / p>

我甚至更改了apache正在运行的用户(并确认该更改与ps一起工作)以保证特权不应成为问题。

#1

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

其他网站

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

你可能得到“Doc​​umentRoot必须是一个目录”错误,即使它实际上是一个目录,因为SELinux扩展。运行system-config-securitylevel(或redhat-c​​onfig-securitylevel)为httpd禁用SELinux或授予SELinux权限 目录:     chcon -R -h -t httpd_sys_content_t / path / to / directory *

我的linux版本不是安全增强型Linux,所以不理解我还是尝试了它:没有效果。

现状

我已经没有尝试过,所以任何诊断问题或建议都会受到高度赞赏

6 个答案:

答案 0 :(得分:21)

您在“其他网站”下发布的链接突出显示了您的问题的根本原因,即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

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

答案 1 :(得分:9)

你不应该只是禁用SELinux。

您需要将httpd_enable_homedirs设置为开启。

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

答案 2 :(得分:7)

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

所以我的修复,因为我发现将/ srv的SELinux文件上下文更改为匹配/ var。妥协是的,但仍然比完全禁用它更好。除此之外...我确定/ srv / www和所有子文件夹都有httpd_sys_content_t来匹配/ var / www下的文件夹,现在一切都很好。

答案 3 :(得分:5)

这与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 /的文档路径不同的目录中,所以我必须按照上面链接中的第3个选项进行更正。我设置my / 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才能使路由正常工作,默认设置是提供空白页面。

service iptables stop

希望能帮助任何有同样问题的人。

答案 4 :(得分:0)

Envirnoment: Linux - SSD上的根文件系统         DocumentRoot在HDD上并通过fstab安装 启动后重启apache2 - 没问题 似乎是在fstab挂载完成之前启动apache的计时问题。

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

答案 5 :(得分:0)

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

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

因此,对于符号链接的DocumentRoot(在本例中,让我们将目录的实际完整路径作为'/ media / myDoc'给出),运行以下两个命令:

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

restorecon -R /media/myDoc

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