Apache - "DocumentRoot must be a directory"的解決方案

 在配置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 就可以使用該目錄下的文件構建網站了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章