使Apache能够使用PHP作为DSO运行来写入PHP文件?

我有PHP作为一个DSO运行。 因此,我的安装程序脚本(写入configuration文件)不能写任何东西。

我如何给apache(user:nobody)写入文件的能力?

我只会在安全环境中的开发服务器上执行此操作。 许多PHP应用程序将生成文件到屏幕,以便它可以安全地复制到configuration目录。

快速(而且不安全)的方法是执行chmod 777 . 从文件应该去的目录。 在这之前运行ls -ld . 获取权限,您将设置他们回来。 在某些情况下,所需的目录将不存在,所以您需要先创build它。 在写入configuration文件之后,立即将目录重置为其原始权限。 正确的命令可能是chmod 755 . 或者chmod 750 . 从目录运行。 用ls命令validation。

更改configuration文件的权限,以便Apache不能再写入( chmod ow configfile )。 应用程序通常带有示例configuration文件。 将其中的一个放置在configuration目录中并进行编辑可能是更好的方法。 这要求你学习和理解configuration选项。 您可以使用在线configuration脚本来协助编辑。

在共享的环境中,当涉及到安全问题时,一切都变得复杂起来。 通过将文件所有权更改为“nobody”,您可以让Apache对该文件进行写入访问,但是如果PHP模块没有设置将每个虚拟主机限制到每个自己的目录,则也会让其他人访问该文件。 检查它是如何在你的环境中设置的。

Apache通常以“nobody”用户身份运行,并将“nobody”分组,以便您可以使用组权限。 将文件的组更改为“nobody”,并将权限设置为664。

如果您不能更改文件的所有者或组,则FTP通常允许您更改权限。 假设Apache不是拥有该文件的用户/组,那么你必须将它设置为777,这是非常不安全的,但这一切取决于你所处的环境types。也许你可以暂时设置它,安装你的应用程序,并将其更改回644或444(只读)。

你可以在/tmp/config/这样的临时目录下编写你的configuration文件。 然后,您可以执行一个shell脚本来将configuration文件从/tmp/config/复制到所需的位置。

要授予所需的权限,可以将用户nobody添加到sudoers文件中。 条目应该看起来像:

 nobody ALL=NOPASSWD: /path/to/your_script.sh 

shell脚本(不要忘记添加执行权限)。

 cp -r /tmp/config/* /desired/path/to/config 

在PHP中,您需要一个如下的小代码片段:

 <?php $output = shell_exec('sudo /path/to/your_script.sh'); echo "$output"; ?> 

这是运行PHP作为DSO与cPanel的典型问题,但它也适用于其他设置。

运行此方法时,PHP进程由运行httpd的用户处理。 在大多数情况下,该用户是“无人”用户。 这意味着当PHP与文件系统上的文件进行交互时,必须由“nobody”用户访问。 这将创build权限问题,因为基于普通cPanel的用户将无法访问“nobody”用户拥有的RW(读/写)文件,而没有正确的权限更改。 大多数PHP Web应用程序/脚本需要写入文件和目录,如果它们是由cPanel用户拥有的,而不将文件/目录的权限更改为777,则会导致问题,并且在某些情况下会破坏您的网站。 。

所以在这种情况下,您可以只手动pipe理权限,将其设置为777

运行此PHP方法时,您必须手动pipe理每个用户的权限,以确保您的PHP应用程序/脚本可以读取和写入需要运行的文件和目录。

或者,更好的是,如果您可以移动到Mod_SuPHP,并且没有性能问题(因为DSO速度更快),您将能够以运行cPanel的用户身份运行PHP。

如果我们忽略了通过DSO运行PHP时可能遇到的权限问题,那么与SuPHP相比,它有一些好处。 首先是速度。 Mod_PHP比Mod_SuPHP快。 这主要是由于由Mod_SuPHP处理的每个请求被包装为拥有文件的用户运行。 在stream量较低的网站上这可能不是很明显,但是在stream量较高的网站上,它可以相当快速地加起来。 第二个function是PHP optcodecaching附加function,如eAcclerator,APC和Xcache。 为了充分利用PHP optcodecaching,您需要一个共享用户,在caching已编译的PHP字节码时使用,并且通过DSO运行PHP,因为“nobody”用户满足了这个需求。 你可以告诉你的服务器是否设置为通过DSO运行PHP,通过转到WHM并在Main >> Service Configuration >> Apache Configuration下查找。 >> PHP和SuExecconfiguration

在这里你可以find更多的细节:

https://helpdesk.wiredtree.com/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=1663