今天在修改了一下httpd.conf文件的DocumentRoot目录后重启了httpd服务,却发现报错了。 DocumentRoot must be a directory 。刚开始以为是自己配置有问题,后来检查了好一遍并确认配置的DocumentRoot就是一个directory啊。哎,只好baidu一下了。呵呵,看来遇到过这种报错的人还真不少啊。总结起来有两种可能导致了DocumentRoot must be a directory报错。
1、DocumentRoot的目录配置中带有中文
如果你的DocumentRoot目录设置中有中文的话,请先修改成英文的试试吧。哈哈……如果还不行的话就请接着往下看吧。
2、SELinux的安全策略搞得鬼啊
这是因为系统启用了SELinux安全策略之后会把目录或文件设成各种类型, 如home_root_t和user_home_t类型等。因些apache的进程就没有权限而无法访问你刚才设置的DocumentRoot了。针对 Apache的进程SELinux的安全策略规定只能访问 httpd_sys_content_t类型的目录或文件。所以把目录或文件的策略类型改成httpd_sys_content_t就可以了。修改命令如下:
chcon -R -h -t httpd_sys_content_t /data/coderbolg/
可以用
3、禁用SELinux
如果你真的被SELinux折磨的没有办法了。那就直接禁用SELinux吧。系统的不安全总比服务器不能访问的权重要低些吧。直接编辑SELinux的配置文件。
vim /etc/sysconfig/selinux
把SELINUX的值从enforcing改成disabled就行。存盘退出。这回一定可以了,如果还不可以就重启一下服务器吧。
在配置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 就可以使用该目录下的文件构建网站了。