Document root must be a directory
这是系统开启了SELinux安全策略造成的。把目录或文件设成了 user_home_t 类型,因此 apache 的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进程只能访问 httpd_sys_content_t 类型的目录或文件。
查看下SElinux状态
[root@localhost home]# getenforce
Enforcing
果然SElinux被开启了,而且还是强制模式,所以只要修改相关的权限就可以了。
解决办法:
方法一:更改文件夹权限
把目录或文件的策略类型改成 httpd_sys_content_t 就可以了。
chcon -R -t httpd_sys_content_t /home/www/
然后用 ls -Z 命令查看文件目录的策略类型(目录权限)。
[root@localhost home]# ls -Z
drwx------. mysql mysql unconfined_u:object_r:user_home_dir_t:s0 mysql
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 www
方法二:禁用SELinux
如果你真的被SELinux折磨的没有办法了。那就直接禁用SELinux吧。系统的不安全总比服务器不能访问的权重要低些吧。直接编辑SELinux的配置文件。
vim /etc/sysconfig/selinux #或 vim /etc/selinux/config
把SELINUX的值从enforcing改成disabled就行。存盘退出,这回一定可以了,如果还不可以就重启一下服务器吧。
若想不重启系统的同学可以使用setenforce命令设置SElinux。
setenforce disabled #或 setenforce 0
chcon 命令参数详解
[root@localhost home]# chcon --help
用法: chcon [选项]... 环境 文件...
或: chcon [选项]... [-u 用户] [-r 角色] [-l 范围] [-t 类型] 文件...
或: chcon [选项]... --reference=参考文件 文件...
Change the SELinux security context of each FILE to CONTEXT.
With --reference, change the security context of each FILE to that of RFILE.
-h, --no-dereference affect symbolic links instead of any referenced file
--reference=参考文件使用指定参考文件的安全环境,而非指定值
-R, --recursive 递归处理所有的文件及子目录
-v, --verbose 为处理的所有文件显示诊断信息
-u, --user=用户 设置指定用户的目标安全环境
-r, --role=角色 设置指定角色的目标安全环境
-t, --type=类型 设置指定类型的目标安全环境
-l, --range=范围 设置指定范围的目标安全环境
以下选项是在指定了 -R 选项时被用于设置如何穿越目录结构体系。
如果您指定了多于一个选项,那么只有最后一个会生效。
-H 如果命令行参数是一个通到目录的符号链接,则遍历符号链接
-L 遍历每一个遇到的通到目录的符号链接
-P 不遍历任何符号链接(默认)
--help显示此帮助信息并退出
--version显示版本信息并退出