gpt4 book ai didi

php - 使用 Centos7 和 Apache 在 PHP 中执行的命令无法连接到网络?

转载 作者:可可西里 更新时间:2023-10-31 23:29:56 27 4
gpt4 key购买 nike

我正在使用 Apache 在 CentOS7 上调试我的 PHP 应用程序。我的应用程序是一个用于管理 Torque 批处理系统的 Web GUI,我使用了 qmgr,它是 Torque 提供的用于执行管理工作的命令行工具。

因为只有 root 用户可以执行 qmgr 而 Apache 服务器不能作为 root 用户运行,我写了一个 C 程序作为包装器,任何人都可以作为 root 用户执行命令。

但是 PHP 应用程序总是给出以下输出:

 socket_connect_unix failed: 15137
qmgr: cannot connect to server (errno=15137) could not connect to trqauthd

这意味着 PHP 应用无法建立套接字连接来连接 Torque 服务器。

这里是一些额外的信息:

  1. PHP应用程序调用的命令可以在shell中正确执行
  2. 同一个 PHP 应用程序可以在 CentOS6 服务器上使用 Apache 正确执行
  3. SELinux 和防火墙被禁用
  4. 我试过Torque的两个版本(5.1和4.10),结果是一样的
  5. Apache 和 PHP 与 CentOS7 的默认 RPM 一起使用。

我认为有一些新的安全限制可能会影响 CentOS7 服务器上的 Apache。

请给我一些建议,谢谢!

最佳答案

我遇到了完全相同的问题。

原因是较新的 Apache.httpd 版本默认将 systemd 属性 PrivateTmp 设置为 true。这会导致 httpd 服务看到一个私有(private)的/tmp 目录,该目录实际上映射到文件系统中的某个其他位置,而不是真正的/tmp 目录。在 Apache 进程中运行的 PHP 与 Apache 服务具有相同的/tmp 目录,从 PHP 派生的任何进程也是如此(例如使用 exec 或 system 等)。因此,当 PHP 调用 qsub(等)时,它也会看到私有(private)/tmp 目录。

这会导致您提到的错误,因为 qsub 在内部使用 unix 套接字 /tmp/trqauthd-unix 与 trqauthd 通信。但是 qsub 看到的是 "fake"/private/tmp 目录而不是真正的目录,所以它找不到套接字。

这解释了为什么当您在控制台中手动运行该命令时该命令有效——在这种情况下,qsub 看到的是真正的/tmp 目录,而不是它从 PHP(运行 Apache 服务)派生时看到的私有(private)目录。

一种解决方案是简单地将文件 httpd.service 中的 PrivateTmp 属性从 true 更改为 false。您可以在 /etc/systemd 目录下找到该文件。它所在的子文件夹可能取决于 linux 发行版,因此请使用 find 命令找到它:

find /etc/systemd -name httpd.service

关于php - 使用 Centos7 和 Apache 在 PHP 中执行的命令无法连接到网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067509/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com