26

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

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

情况:

  • 该代码在虚拟 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 一起使用)以确保特权不应该成为问题。

堆栈溢出

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

其他网站

我发现最有用的是这个建议

由于 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,所以在不理解的情况下我还是尝试了它:没有效果。

现在的情况

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

4

6 回答 6

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

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

于 2013-02-11T10:22:14.680 回答
11

您不应该只禁用 SELinux。

您需要将 httpd_enable_homedirs 设置为 on。

yum -y install policycoreutils-python
setsebool -P httpd_enable_homedirs on
于 2014-02-12T01:05:48.663 回答
7

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

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

于 2013-04-26T15:13:51.667 回答
6

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

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

我的问题是我将我的网站存放在与 /var/www/ 的 documentroot 路径不同的目录中,因此我必须按照上面链接中的第三个选项进行更正。我将 /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 停止

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

于 2014-09-07T01:45:00.483 回答
0

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

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

于 2015-02-10T12:46:24.957 回答
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您不仅会解决问题,而且将来运行(或自动重新标记)时它不会再次中断。

于 2015-03-03T16:50:50.390 回答