经过数百次尝试,我终于成功让 Centos 5.8 挂载了 VirtualBox 共享文件夹(不是只读),现在显示为:
/media/sf_sites
这是我的主机(Mac OS X 10.8.2)上包含站点的一个文件夹。
该目录及其子文件夹均归用户root
和组所有vboxsf
我已将用户添加apache
到该组vboxsf
然而httpd不允许我将共享文件夹用作文档根目录。我的虚拟主机设置为:
DocumentRoot /media/sf_sites/mysite/public
Apache 重新启动时我得到以下信息:
Starting httpd: Warning: DocumentRoot [/media/sf_sites/mysite/public] does not exist
[ OK ]
毫不奇怪,当我在浏览器中查看该网站时,出现了 403 错误。(“您无权访问此服务器上的 /。”)
有什么想法是否可以实现这个目标?
我想在 Mac 上进行开发,但使用 VirtualBox 中的 Linux 作为开发服务器。还有其他方法吗?
答案1
这是因为共享文件夹的 SELinux 安全上下文不允许 Apache 使用它。由于无法更改 VBox 共享文件夹的安全上下文,您可以修改 SELinux 安全策略以允许 Apache 使用该上下文。这类似于在防火墙中打开端口以向应用程序公开某个端口。关闭 SELinux 并不是一个好主意,正如其他人所建议的那样,因为这会使您的服务器更容易受到攻击。
首先,确保您的 apache 用户是拥有共享文件夹的组的一部分,如果不是,您可以使用如下命令添加它(用户/组名称在您的系统上可能不同):
usermod -aG vboxsf apache
然后你可以使用audit2allow生成新的安全策略来解决您的问题。这是一个很好的教程。
如果您很懒,只想允许 Apache 读取您的 VBox 共享文件夹,您可以调整以下my_httpd_t.te
策略文件并使用其中包含的命令将其应用于您的系统。
module my_httpd_t 1.0;
require {
type httpd_t;
type vmblock_t;
class dir read;
class file { read getattr open };
}
#============= httpd_t ==============
allow httpd_t vmblock_t:dir read;
allow httpd_t vmblock_t:file { getattr open read };
# Generated by audit2allow
# To apply this policy:
## checkmodule -M -m -o my_httpd_t.mod my_httpd_t.te
## semodule_package -o my_httpd_t.pp -m my_httpd_t.mod
## semodule -i my_httpd_t.pp
## systemctl restart httpd
答案2
在你的Linux中创建一个挂载点,安装SSHFS如果你还没有的话。
在 CentOS 中执行以下操作
sudo su - apache
sshfs root@< your OS X IP >:< web folder path > < mount point >
例如:
- OS X IP:192.168.0.10
- OS X Web 文件夹路径:/Users/me/webOSX
- CentOS 挂载点:/var/www/webLinux
sshfs 命令将是:SSHFS[电子邮件保护]:/用户/我/webOSX / var / www / webLinux
答案3
我从来没有解决过“文件意外结束”的问题,但是后来流浪汉出现了,它为你完成了所有艰苦的工作。
答案4
DocumentRoot
如果您需要将共享文件夹设置为Apache 服务器,则需要禁用 SELinux 。
转到/etc/selinux/config
并更新如下内容:
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
然后重启虚拟机。这也适用于 vagrant。