我使用 Webmin 创建了以下虚拟主机:
<VirtualHost *:80>
DocumentRoot "/var/www/whatever"
ServerName whatever.ourdomain
<Directory "/var/www/whatever">
allow from all
Options +Indexes
</Directory>
</VirtualHost>
当我重新启动 Apache 时
Starting httpd: Warning: DocumentRoot [/var/www/whatever] does not exist
问题是,该目录确实存在。我正盯着它看。pwd
显示这是我的当前目录,等等。拼写正确并不难。我在 httpd 日志中找不到任何其他错误或警告。apache:apache 拥有该目录及其所有子目录/文件。这里没有任何符号链接或任何内容。我遗漏了什么或我还应该查看什么来确定原因?
操作系统是CentOS 6.0
答案1
我首先想到的是 Apache 是否有权访问该目录?
还有这个:https://stackoverflow.com/questions/3948038/apache-says-my-documentroot-directory-doesnt-exist
答案2
以下是 SELinux 案例的教程方法:
查看 SELinux 是否处于活动状态:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
如果是这样,进行一些比较检查可能会有所帮助。例如,服务器在 处有一个默认的 DocumentRoot /var/www/html
,但我们希望它在其他地方,例如/path/to/document/root
。
如果 SELinux 没有主动干扰资源,则ls -dZ
目录上将显示类似以下内容:
$ ls -dZ /path/to/document/root
? /path/to/document/root/
另一方面,如果应用了 SELinux 上下文,ls -dZ
则更像这样:
$ ls -dZ /path/to/document/root
drwxrws--x+ cfgadm cfgadmin system_u:object_r:file_t:s0 /path/to/document/root
如果我们将其与正在运行的 DocumentRoot 进行比较,它看起来会像这样:
$ ls -dZ /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
和_r
与(和( ) 参数相关_t
。下面是精简版的手册页:-r
--role
-t
--type
chcon
NAME
chcon - change file security context
SYNOPSIS
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
DESCRIPTION
Change the security context of each FILE to CONTEXT. With --reference,
change the security context of each FILE to that of RFILE.
--reference=RFILE
use RFILE's security context rather than specifying a CONTEXT value
-R, --recursive
operate on files and directories recursively
乍一看,下面的方法似乎可行,但实际上可能不可行。
$ sudo chcon -R -t httpd_sys_content_t /path/to/document/root
如果 Web 服务器仍然无法看到 DocumentRoot,请注意上下文一直追溯到根目录:
$ sudo chcon -R -t httpd_sys_content_t /path/to/document
$ sudo chcon -R -t httpd_sys_content_t /path/to
$ sudo chcon -R -t httpd_sys_content_t /path
此时,Web服务器就可以看到该目录了。
是的,今晚我学到了惨痛的教训。
注:使用氯乙烯从概念上讲,根据 RedHat 文档,它有一个缺点(5.6.1. 临时变更:chcon) 指出:
The chcon command changes the SELinux context for files. However, changes
made with the chcon command do not survive a file system relabel, or the
execution of the restorecon command.
使用塞马纳盖和恢复控制做出更持久的改变。下面是一个简短的例子:
$ sudo semanage fcontext --add -t httpd_sys_content_t -s system_u \
"/path/to/document/root(/.*)?"
$ sudo restorecon -FR /path/to/document/root
关于恢复控制, 注意-F需要影响整个上下文(即用户和类型)。此外,-R表示以递归方式进行更改。参数-v或者-p可以以详细或简洁的方式显示进度。使用—FRnv看看在不实际进行任何改变的情况下会发生什么。
一次塞马纳盖以这种方式使用,可以使用以下命令查看本地安全更改:
$ sudo semanage export
输出管理出口可能会被保存和使用管理导入以便更容易地将一组更改应用到各种系统。
注意:此答案提供了网站最基本的类型上下文。安全性可以更加精细。例如,使用以下命令查看可应用于 Web 服务器页面的类型列表:
$ seinfo -t | grep http
注意:像塞马纳盖和信息默认情况下可能不会安装。至少在某些发行版中,所需的软件包可能以如下方式命名:
policycoreutils-python
setools-console
答案3
听起来像是 SELinux。我建议您使用它。查看 /var/log/audit 目录以确认。
更糟糕的情况是,您可以随时关闭 selinux,如前所述,但我建议您使用它。例如,如果我要创建一个用于 Apache 的目录,它将没有正确的上下文,如此处所述。
[root@amp23140 www]# ls -Z
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 whatever
所以如果发生这种情况,我只需从另一个目录应用上下文,在本例中是 html:
[root@amp23140 www]# chcon whatever --reference=html
[root@amp23140 www]# ls -lZ
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 error
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 icons
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 whatever
答案4
在 root 中使用此命令来更改“httpd_sys_content_t”的安全上下文,以允许 Apache 执行。
chcon -R -h -t httpd_sys_content_t /var/www/whatever
用于ls -dZ /var/www/whatever
查看安全角色的详细信息