在配置apache服务时经常遇到DocumentRoot must be a directory的错误提示,刚接触到apache时折腾了几个小时才找到错误的原因,出现这样的错误一般都是由于selinux的原因。
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux® 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。
Apache - "Document root must be a directory" 问题?
有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。
现象描述:
不使用系统默认的 /var/www/html作为系统的Document Root,自己新建一个目录后修改
/etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,发现Apache无法起动,系统报错:
检查 avcmessage,查看 /var/log/messages文件,发现有类似以下内容的这样一段:
Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc:
denied{ getattr } forpid=19029 exe=/usr/sbin/httpd
path=/var/www/html/about.html dev=dm-0 ino=373900
scontext=root:system_r:httpd_t tcontext=user_u:object_r:user_home_t
tclass=file
用
#semanage fcontext -l | grep '/var/www'
获知默认/var/www目录的 SELinux 上下文:/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0从中可以看到 Apache 只能访问包含httpd_sys_content_t标签的文件。
假设要Apache 使用/www作为网站文件目录,那么就需要给这个目录下的文件增加httpd_sys_content_t标签,分两步实现。
首先为 /www 这个目录下的文件添加默认标签类型:
#semanage fcontext -a -t httpd_sys_content_t'/srv/www(/.*)?'
然后用新的标签类型标注已有文件:
#restorecon -Rv /srv/www
之后 Apache 就可以使用该目录下的文件构建网站了。
转载于:https://blog.51cto.com/zhangjianjian/651802