在配置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 就可以使用该目录下的文件构建网站了。

解决办法2:

很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了。

# chcon -t httpd_sys_content_t [file_name | dir_name]
# chcon -R -h -t httpd_sys_content_t /www
然后可以用 ls -laZ 命令查看文件目录的策略类型。(T002)

解决方法3:

关掉selinux  
#setenforce 0

解决方法4:
或者更改/root/website这个文件的selinux属性,让它匹配httpd这个服务器的要求
怎么改?我们可以复制/var/www/html这个目录的selinux属性
#chcon -R --reference /var/www/html /root/website
然后在重启服务,之后你就看到它没有报错了
不过你去访问localhost的时候,会发现访问拒绝 这是为什么呢?主要是因为你的/root的权限是750,ahache这个用户没有权限访问,你需要更改掉权限,可以这样改
#chmod -R 755 /root
然后去访问 发现正常了

延伸阅读:SELinux简介

RedHat Enterprise Linux AS 3.0/4.0中安全方面的最大变化就在于集成了SELinux的支持。

SELinux的全称是Security-Enhanced Linux,是由美国国家安全局NSA开发的访问控制体制。

SELinux可以最大限度地保证Linux系统的安全。至于它的作用到底有多大,举一个简单的例子可以证明:

没有SELinux保护的Linux的安全级别和Windows一样,是C2级,但经过保护SELinux保护的Linux,安全级别

则可以达到B1级。如:我们把/tmp目录下的所有文件和目录权限设置为0777,这样在没有SELinux保护的情

况下,任何人都可以访问/tmp 下的内容。而在SELinux环境下,尽管目录权限允许你访问/tmp下的内容,

但SELinux的安全策略会继续检查你是否可以访问。

NSA推出的SELinux安全体系结构称为 Flask,在这一结构中,安全性策略的逻辑和通用接口一起封装在与

操作系统独立的组件中,这个单独的组件称为安全服务器。SELinux的安全服务器定义了一种混合的安全性

策略,由类型实施 (TE)、基于角色的访问控制 (RBAC) 和多级安全(MLS) 组成。通过替换安全服务器,可

以支持不同的安全策略。SELinux使用策略配置语言定义安全策略,然后通过checkpolicy 编译成二进制形

式,存储在文件(如目标策略/etc/selinux/targeted/policy/policy.18)中,在内核引导时读到内核空间

。这意味着安全性策略在每次系统引导时都会有所不同。

SELinux的策略分为两种,一个是目标(targeted)策略,另一个是严格(strict)策略。有限策略仅针对部分

系统网络服务和进程执行SELinux策略,而严厉策略是执行全局的NSA默认策略。有限策略模式下,9个(可

能更多)系统服务受SELinux监控,几乎所有的网络服务都受控。

配置文件是/etc/selinux/config,一般测试过程中使用“permissive”模式,这样仅会在违反SELinux规

则时发出警告,然后修改规则,最后由用户觉得是否执行严格“enforcing”的策略,禁止违反规则策略的

行为。

规则决定SELinux的工作行为和方式,策略决定具体的安全细节如文件系统,文件一致性。

在安装过程中,可以选择“激活”、“警告”或者“关闭”SELinux。默认设置为“激活”。

安装之后,可以在“应用程序”-->“系统设置”-->“安全级别”,或者直接在控制台窗口输入“system

-config- securitylevel”来打开“安全级别”设置窗口。在“SELinux”选项页中,我们不但可以设置“

启用”或者“禁用”SELinux,而且还可以对已经内置的SELinux策略进行修改。

SELinux相关命令:

ls -Z

ps -Z

id -Z

分别可以看到文件,进程和用户的SELinux属性。

chcon 改变文件的SELinux属性。

getenforce/setenforce查看和设置SELinux的当前工作模式。

修改配置文件/etc/selinux/config后,需要重启系统来启动SELinux新的工作模式。

http://dadait.blog.163.com/blog/static/3207916201361122548407/

linux CentOs 权限导致的Apache - "DocumentRoot must be a directory"的解决方案的更多相关文章

  1. Linux Centos安装及卸载Apache

    一.卸载 1.查看有没有安装apache,出现下面信息则安装过 [root@localhost ~]# rpm -qa|grep httpd httpd-2.2.15-53.el6.centos.x8 ...

  2. Linux(CentOS)下编译安装apache

    Centos7.6系统 已经安装lnmp一键环境 想装个apache跑php7 (php7的安装以及与apache的交互在这里: https://www.cnblogs.com/lz0925/p/11 ...

  3. linux CentOS 权限问题修复(chmod 777 -R 或者chmod 755 -R问题修复)

    我个人曾经有一次经历: 就是在修改文件夹权限的时候,本来该执行: #chmod 777 -R ./ 结果我漏掉了那个".";执行的命令是chmod 777 -R /. 这个命令一定 ...

  4. linux服务器安装pyspide关于rgnutls.h: No such file or directory 的解决方案

    In file included from src/docstrings.c:4:0: src/pycurl.h:148:30: fatal error: gnutls/gnutls.h: No su ...

  5. 在Linux(CentOS 6.6)服务器上安装并配置基于Apache的SVN服务器

    #!/bin/bash # # 在Linux(CentOS 6.6)服务器上安装并配置基于Apache的SVN服务器: # # .安装服务 # .创建svn版本库 # .创建svn用户 # .配置sv ...

  6. Linux CentOS 7 下 Apache Tomcat 7 安装与配置

    前言 记录一下Linux CentOS 7安装Tomcat7的完整步骤. 下载 首先需要下载tomcat7的安装文件,地址如下: http://mirror.bit.edu.cn/apache/tom ...

  7. Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因

    原文:Linux(CentOS)系统下安装好apache(httpd)服务后,其他电脑无法访问的原因 今天试了下在虚拟机上利用CentOS系统的yum命令安装好了httpd(apache2.4.6), ...

  8. centos LAMP第二部分apache配置 下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转 配置apache的访问日志 配置静态文件缓存 配置防盗链 访问控制 apache rewrite 配置开机启动apache tcpdump 第二十节课

    centos    LAMP第二部分apache配置  下载discuz!配置第一个虚拟主机 安装Discuz! 用户认证 配置域名跳转  配置apache的访问日志  配置静态文件缓存  配置防盗链 ...

  9. CentOS httpd服务(Apache)

    1.从ISO镜像安装,Apache 服务的软件包名称为 httpd #检查源配置[root@localhost media]# cat /etc/yum.repos.d/CentOS-Media.re ...

随机推荐

  1. linux创建swap分区

    创建交换分区 root@zabbix-server:~# mkdir /swap root@zabbix-server:~# cd /swap/ root@zabbix-server:/swap# l ...

  2. JSON还原为结构体

    JSON还原为结构体 1)JSON字符串还原为结构体: 2)访问结构体的字段值: 本例运行效果图: uses SynCommons; const // JSON字符串 JSON1 = '{' + #1 ...

  3. java生成自己定义的表ID

    需生成例如以下ID: 56d7ade1-87d1-4f54-8dc8-13611c8c2545 27181ad4-4214-4e12-af3a-911a0103a12f 24cafdfb-eac3-4 ...

  4. Java 反照机制中 getMethod()和getDeclaredField()区别

    Java 反射机制中 getMethod()和getDeclaredField()区别 今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类 ...

  5. ARM指令集—SWP指令

    ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...

  6. JQuery 动态提交form

    function exportExcel() { var merchantName = $('#merchantName').val(); var merchantNo = $('#merchantN ...

  7. javascript模拟post提交

    通过js模拟post提交1:请求需要的参数过长,超过get允许的最大长度2:想要隐藏地址栏的参数 //新创建一个form表单document.write('<form name=myForm&g ...

  8. JS中字符串的相关操作

    一.字符串的创建 创建一个字符串有几种方法.最简单的是用引号将一组字符包含起来,可以将其赋值给一个字符串变量. var myStr = "Hello, String!"; 可以用双 ...

  9. 【Linux】Dockerfile,ubuntu默认shell不是bash?RUN source命令报错!

    Dash is not bash 在一些 docker 官方 Image 中,执行一些 .sh 文件的时候遇到了一些奇怪现象,比如: 1 2 3 # Run something like: [[ $A ...

  10. Zeppelin原理简介

    Zeppelin是一个基于Web的notebook,提供交互数据分析和可视化.后台支持接入多种数据处理引擎,如spark,hive等.支持多种语言: Scala(Apache Spark).Pytho ...