2013-02-09 111 views
25

我几乎肯定是一个新手问题。我期望在写这个问题的时候找到问题,但我仍然陷入困境。Apache重新启动原因DocumentRoot必须是一个目录,即使它是一个目录,并且似乎没有特权问题

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

现状:

  • 的代码是在一个虚拟的VMware虚拟机运行4.0.4集结744019
  • Linux版本是Linux的科学版本6.4(碳)
  • 的版本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 

我认为它可能b这是一个特权问题(这是一个虚拟开发机器与互联网隔离,并且我正在排除故障,因此我不太担心安全性),因为您可以看到我将权限设置为777.

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

#1

有几个堆栈溢出的答案,但大多说“读错误讯息,这是说,目录实际上不存在”。其他人则暗示最终可能会出现尾随的斜线,这很糟糕。

其他网站

最有用的我发现了this被通知

你可能得了“的DocumentRoot必须是目录”的错误,即使真的是因为SELinux的扩展名的目录。运行系统配置-securitylevel中(或配置工具securitylevel中)来禁用SELinux为httpd或给SELinux的权限是 目录: chcon这个-R -h -t httpd_sys_content_t /路径/到/目录下的*

我的版本的Linux是不是安全增强的Linux,所以不理解我反正试了一下:没有效果。

现状

我已经江郎才尽了尝试,所以任何诊断的问题或建议,将不胜感激

+1

行292肯定是你正在看的? Grep你的整个配置DocumentRoot,也许有一个你错过了? – 2013-02-09 09:56:39

+0

谢谢保罗。 Grep会在前缀中返回一些注释,并在第292行中提供有问题的行。(目前,违规行指向/ var/www/html)。 – 2013-02-09 10:07:39

+0

你试过在strace下启动Apache吗?可能会给出线索。 – voetsjoeba 2013-02-10 13:09:46

回答

22

你贴在“其他网站”的链接突出的根本原因你问题,这是Selinux。

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

在RedHat/CentOS的/科学的Linux中,这可以很容易地通过编辑来完成的/ etc/SYSCONFIG/SELinux的 - 找到参数“SELinux的”,并更改选项“强制”为“已禁用”按下面的摘录:

# 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

这工作。谢谢 – 2013-02-11 13:52:11

+0

哇,我希望我早点找到了!当我尝试在默认的'/ var/www/html'目录之外加载一个页面时,禁用Selinux也解决了我获得'(13)Permission denied'的问题。 – yellavon 2013-06-20 22:32:09

+2

禁用selinux是不好的。 [链接](http://stopdisablingselinux.com/)在webroot目录中设置适当的上下文以便Apache可以访问它更好。 @Cedric有正确的答案,这是'setsebool -P httpd_enable_homedirs on' – 2014-04-08 16:08:33

7

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

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

+0

很高兴知道您是否被禁止彻底禁用它。 – yellavon 2013-06-20 22:34:03

+2

更详细一点 - 更改文件上下文的方法是使用以下命令:chcon -R -h -t httpd_sys_content_t/path/to/directory一旦你这样做了,Apache将能够访问/ path/to /目录并且从它提供文件。 – 2013-08-14 11:08:12

9

您不应该只是禁用SELinux。

您需要将httpd_enable_homedirs设置为打开。

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

这是正确的答案。谢谢@Cedric。 – skidadon 2015-05-28 15:55:24

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 /的DocumentRoot的路径在我的网站,所以我只好跟着第三选项在上面的链接中进行更正。我为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来获取路由工作,默认正在提供空白页面。

服务iptables停止

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

+0

这些工作适合我的特定安装。正在使用不同于默认的目录服务网站,并且这两个特定的命令修复了它。确保之后重新启动Apache。 – tatorface 2014-11-14 19:17:49

0

Envirnoment: Linux的 - 对一个HDD一个SSD DocumentRoot的根文件系统,并安装通过fstab中 开机后重新启动的Apache2 - 没问题 似乎是完成fstab的坐骑之前的Apache开始的计时问题。

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

0

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

其次,改变了SELinux文件上下文的时候,你应该建立一个永久规则这条道路,在新的文件被复制和/或替换现有文件,restorecon实际上解决了这个问题,而不是破坏,使得它,就像你只使用chcon一样。

因此,对于symlink'ed的DocumentRoot(让我们给实际的完整路径的目录在这个例子中 '/媒体/ myDoc'),运行这两个命令:

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

restorecon -R /media/myDoc

请注意,以这种方式使用semanage时需要完整路径。您不仅会解决问题,而且在将来运行restorecon(或auto-relabel)时不会再次中断。

相关问题