我正在尝试使用 CentOS 6 和 Apache 启动 Web 服务器。网站的文件托管在 Windows 文件共享中。以下是文件中fstab
用于挂载 Web 文件的行:
\\192.168.1.10\apache /var/www/html cifs credentials=/root/secret.txt,uid=apache,gid=apache 0 0
。这似乎运行良好。
这是 vhost.conf 文件:
Listen 80
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName sub.domain.com
DocumentRoot "/var/www/html/domain.com/sub/public_html"
#ErrorLog /var/www/html/domain.com/sub/logs/error.log
#CustomLog /var/www/html/domain.com/sub/logs/access.log combined
</VirtualHost>
我运行了该命令ls -l /var/www/html/domain.com/sub/public_html
,以下是输出:
total 1
-rwxr-xr-x. 0 apache apache 0 Jan 26 20:43 index2.txt
-rwxr-xr-x. 0 apache apache 45 Jan 26 19:33 index.html
命令ls -l /var/www/html/domain.com/sub
输出为:
total 0
drwxr-xr-x. 0 apache apache 0 Jan 26 20:00 logs
drwxr-xr-x. 0 apache apache 0 Jan 26 20:43 public_html
当我去http://sub.domain.com,我得到了通用的 Apache 屏幕。一时兴起,我访问了 URLhttp://sub.domain.com/index.html;浏览器说我没有权限访问该页面——同样的事情http://sub.domain.com/index2.txt. 对于 URLhttp://sub.domain.com/index2.html,浏览器表示文件确实不存在。这告诉我我的‘手指’都指向正确的方向。 知道我的问题可能是什么吗?
文件中的日志行vhost.conf
被注释掉了,因为httpd
不会用这些行重新启动。我认为这是同样的问题。
答案1
由于Apache设置本身没有明显的问题,所以一定是OS设置的权限存在问题。
Apache 要求 apache 用户也具有对父目录的访问权限。
由于 CentOS 附带 SELinux,因此这也可能是问题所在。也许您没有使用 SELinux 主动设置权限,但 Linux 本身具有用于远程挂载的默认 SELinux 设置。
您可以使用 进行检查ls -Z
。
以下是 askubuntu 中一个有趣的 OP:https://askubuntu.com/questions/451922/apache-access-denied-because-search-permissions-are-missing
答案2
我们从您的问题中可以看出,您正在运行 SELinux,并尝试让 Apache 从 CIFS 共享中读取 Web 内容。默认情况下,SELinux 不允许这样做,但您可以通过设置适当的布尔值来启用它。
setsebool -P httpd_use_cifs 1
答案3
问题出在 SELinux 上。我安装共享的方式,SELinux 安全上下文不允许 Apache 访问共享中的文件。示例SELinux 操作指南恰好适用于 Apache。
我使用了命令ls -Z
,而不仅仅是ls -l
,我发现挂载文件的 SELinux 安全上下文是错误的。我将fstab
文件中的行更改为
\\192.168.1.100\apache /var/www/html cifs credentials=/root/apache.pass,uid=apache,gid=apache,context=system_u:object_r:httpd_sys_content_t:s0 0 0
我需要这个添加的上下文参数来让 SELinux 允许 Apache 访问这些文件。