我几乎可以肯定是一个新手问题。我希望在写这个问题时能找到问题,但我仍然陷入困境。
我想更改Apache的DocumentRoot,但我不断收到错误消息“DocumentRoot必须是一个目录”。
情况:
在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建议
你可能得到“DocumentRoot必须是一个目录”错误,即使它实际上是一个目录,因为SELinux扩展。运行system-config-securitylevel(或redhat-config-securitylevel)为httpd禁用SELinux或授予SELinux权限 目录: chcon -R -h -t httpd_sys_content_t / path / to / directory *
我的linux版本不是安全增强型Linux,所以不理解我还是尝试了它:没有效果。
现状
我已经没有尝试过,所以任何诊断问题或建议都会受到高度赞赏
答案 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安全上下文。
我的问题是我将网站放在与/ 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
(或自动重新标记)时也不会再次崩溃。