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

Sta*_*ura 26 apache apache2

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

我想更改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"
Run Code Online (Sandbox Code Playgroud)

当我重新启动时,我收到消息

Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
Run Code Online (Sandbox Code Playgroud)

迄今采取的步骤:

我确保目录存在:

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
Run Code Online (Sandbox Code Playgroud)

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

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

堆栈溢出

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

其他网站

我发现的最有用的是这个被通知

你可能得到"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,所以不理解我还是尝试了它:没有效果.

现在的情况

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

小智 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
Run Code Online (Sandbox Code Playgroud)

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

  • 禁用selinux是不好的.[link](http://stopdisablingselinux.com/)最好在webroot目录上设置正确的上下文,以便apache可以访问它.@Cedric有正确的答案,这是`setsebool -P httpd_enable_homedirs on` (2认同)

Ced*_*ric 11

你不应该只是禁用SELinux.

您需要将httpd_enable_homedirs设置为on.

yum -y install policycoreutils-python
setsebool -P httpd_enable_homedirs on
Run Code Online (Sandbox Code Playgroud)


小智 7

我今天遇到了这个问题,因为我将我的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并提供服务来自它的文件. (2认同)

小智 5

这与David的答案基本相同,但只是更清楚一点,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 /的文档路径不同的目录中,所以我必须按照上面链接中的第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才能使路由正常工作,默认设置是提供空白页面.

服务iptables停止

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