这是一个复杂的(至少对我来说)问题,所以请多多包涵。
我在 VirtualBox 4.2.10 中运行了三个带有各种来宾操作系统(如下所列)的虚拟机,它们都运行 Apache 2.2+ 或 IIS 7.5 Web 服务器,它们指向主机(Windows 8)上的相同网络共享。
来宾操作系统/服务器/PHP 版本:
- Windows 7 旗舰版 - IIS 7.5 - PHP 5.3.23
- Windows XP Pro - Apache/2.2.24 - PHP/5.2.9
- Debian 6.0.7 - Apache/2.2.16 - PHP 5.3.3
所有 3 台服务器(4 台,包括主机)都可以正常访问和显示网页,PHP 脚本也可以正确执行,但有一个主要例外:Apache 和 PHP 都不能写入网络共享中的任何位置。
使用以下命令,通过 fstab 以(假定的)读/写权限安装网络共享:
//dmorton/http /var/www cifs rw,user=dmorton/server,password=******
共享安装得很好,我可以通过 gedit 或终端读取/写入文件,所以我知道共享已正确安装,尽管我希望 fstab 中的代码可以进行一些改造。我通过网络使用连接,而不是使用 VirtualBox 的共享文件夹功能,因为无论我尝试什么,我都无法让 Apache 以这种方式识别共享。
正如我上面提到的,Apache 可以很好地显示网页和执行 PHP 脚本,除非它尝试写入日志文件 (apache) 或调试文件 (PHP)。我不得不重新定位 Apache 日志以便能够读取它们,因为在配置为写入共享时它们甚至没有被写入,就像其他 2 位来宾一样。以下是相关错误日志的摘录:
[Fri Apr 05 08:02:23 2013] [error] [client 192.168.1.100] PHP Warning: file_put_contents(/var/www/PGO2.1/chatbot/debug/7o13ii3te7a6u2q52hpu1b3m86.mem_trace.txt): failed to open stream: Permission denied in /var/www/PGO2.1/library/error_functions.php on line 333, referer: http://dmorton-deb64/PGO2.1/gui/plain/index.php?say=test&submit=say&bot_id=1&format=html
Fri Apr 05 09:01:25 2013] [error] [client 192.168.1.100] PHP Warning: file_put_contents(commonWords.dat): failed to open stream: Permission denied in /var/www/tmp/sort_cw.php on line 6, referer: http://dmorton-deb64/tmp/
如您所见,PHP 被拒绝访问文档根目录中至少两个不同位置的文件。我知道这是一个权限问题,我尝试了不同的方法(如下所列)来纠正这个问题,但我显然在这里遗漏了一些东西。对于 *nix 系统,我是一个相对较新的人,所以我希望这很简单。无论如何,这里是我试图“修复”这个的方法:*
- 在主机操作系统上创建了一个特殊帐户,所有 VM 都可以使用该帐户以完全权限访问共享
- 为“所有人”设置对主机文件夹的“完全控制”权限
- 在 Debian 中使用与主机帐户相同的凭据设置一个帐户,并为其授予完全权限
- 将 Apache 配置为以 #3 中提到的用户身份运行,并具有“root”组权限
- 尝试在 fstab 中使用其他挂载选项以使共享对所有人都可写
- 请注意,我知道部分或全部这些设置所涉及的安全隐患。一旦我找到了解决问题的方法,我将把它们恢复到更安全的基础上,一次一个。
好的,现在您已经了解了问题的总体要点,我不得不问:
如何纠正上述问题,我在这里遗漏了什么?