二、案例分析
& E) W4 [) e% m' t& s Apache - "Document root must be a directory" 问题?
- Z0 q% q3 }. n/ m r1 r# s5 M, ^- K 有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。
4 i9 {4 i! |5 G w 现象描述:
l6 G4 q1 `9 q" @" t$ D& N 不使用系统默认的 /var/www/html作为系统的Document Root,自己新建一个目录后修改* n0 j6 H3 w0 j9 I/ Y
/etc/httpd/conf/httpd.conf 中的配置,然后重起Apache的Daemon,发现Apache无法起动,系统报错:, Q+ {& Y1 ?9 V) n8 N
Document root must be a directory8 h1 a9 X1 ^- ^% \
但是,我们设置的DocumentRoot 的确是一个目录,而且apache用户具有可读权限。转自:考试网 - [Examw.Com]
/ {1 w" m) c. [! L. p! p- n 另一种情况:新建一个虚拟目录或文件后,无法访问,显示 Forbidden, 403 Error,但文件或目录有可读
* Q* L; ` V$ @- G7 |$ ? @# _ l 权限。) i' A4 j' e% n
问题产生的原因:; o' f0 f, L0 E$ k' _; {
一开始想来想去想不出为什么,但是给我感觉是权限的问题,用传统的Linux的思维方式来看,权限绝对没! e. B5 D1 Z9 v! V' n6 s( x6 T% q
有问题。但是仔细一想,SELinux是不是会有其他安全的设定?% s/ u7 y0 f' \7 {
检查 avcmessage,查看 /var/log/messages文件,发现有类似以下内容的这样一段:
& F. \: d& o9 ]" c+ ?' f" ~/ P Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc:0 o0 _+ z" J& o O+ K: Z
denied{ getattr } forpid=19029 exe=/usr/sbin/httpd
6 R5 X4 D# B7 ] path=/var/www/html/about.html dev=dm-0 ino=373900 u! l+ B! n- [' k4 Y; h
scontext=root:system_r:httpd_t tcontext=user_u:object_r:user_home_t; H6 M% |0 {) a6 @6 y) A
tclass=file5 t$ z8 j3 h* e' P% U) `
嘿嘿,问题找到了,果然是SELinux的新特性搞的鬼。我把目录或文件设成了user_home_t类型,因此
, ^: P: `& O" A9 x- T apache的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进
# p) I [+ c' C+ N- ]( H 程只能访问httpd_sys_content_t类型的目录或文件。
1 b, Y* b0 F' {" B+ o 解决办法:; c ^3 q3 l, Z0 ~ Y) t
很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了。
$ F) u: e' d# X0 n1 R% b5 K # chcon -t httpd_sys_content_t [file_name | dir_name]
3 e# g8 S. u- v- I 然后可以用 ls -laZ 命令查看文件目录的策略类型。() |