让 Apache 能够在 PHP 以 DSO 形式运行的情况下写入 PHP 文件吗?

让 Apache 能够在 PHP 以 DSO 形式运行的情况下写入 PHP 文件吗?

我将 PHP 作为 DSO 运行。因此,我的安装程序脚本(用于写入配置文件)无法执行任何写入操作。

我如何赋予 apache(用户:nobody)写入文件的权限?

答案1

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

执行此操作的快速(但不安全)方法是chmod 777 .从文件应存放的目录执行。执行此操作之前,请运行ls -ld .以获取您将重新设置它们的权限。在某些情况下,所需的目录不存在,因此您需要先创建它。写入配置文件后,立即将目录重置为其原始权限。正确的命令很可能是chmod 755 .chmod 750 .目录运行的。使用 ls 命令进行验证。

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

答案2

您可以将配置文件写入临时目录(例如)下/tmp/config/。然后,您可以执行 shell 脚本将配置文件复制到/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";
?>

答案3

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

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

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

答案4

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

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

因此在这种情况下,你只能手动管理权限,将其设置为 777

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

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

如果我们忽略通过 DSO 运行 PHP 时可能遇到的权限问题,与 SuPHP 相比,它还是有一些优势的。首先是速度。Mod_PHP 比 Mod_SuPHP 更快。这主要是因为 Mod_SuPHP 处理的每个请求都被包装为以拥有文件的用户身份运行。这在流量较低的网站上可能不太明显,但在流量较高的网站上,它会很快累积起来。第二个是 PHP optcode 缓存附加功能(如 eAcclerator、APC 和 Xcache)的完整功能。要充分利用 PHP optcode 缓存,您需要一个共享用户,该用户用于缓存编译后的 PHP 字节码,并通过 DSO 运行 PHP,以“无人”用户的身份运行 PHP,以满足这一需求。您可以通过转到 WHM 并查看 Main >> Service Configuration >> Apache Configuration 来判断您的服务器是否设置为通过 DSO 运行 PHP。>> PHP 和 SuExec 配置

您可以在这里找到更多详细信息:

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

相关内容