2015-06-26 3 views
3

Я отлаживаю свое приложение PHP на CentOS7 с помощью Apache. Мое приложение - это веб-интерфейс для управления пакетной системой Torque, и я использовал qmgr, который представляет собой инструмент командной строки, предоставляемый Torque для выполнения работы по управлению.Команда, выполняемая на PHP с Centos7 и Apache, не может подключиться к сети?

Поскольку только пользователь 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 может быть выполнена правильно в оболочке
  2. То же PHP приложение может быть выполнено правильно на сервере CentOS6 с Apache
  3. SELinux и брандмауэр отключены
  4. Я пробовал две версии (5.1 и 4.10) Torque, результат тот же
  5. Apache и PHP используются с установленными по умолчанию RPM от CentOS7.

Я думал, что есть несколько новых ограничений безопасности, которые могут повлиять на Apache на сервере CentOS7.

Пожалуйста, дайте мне несколько предложений, спасибо!

+0

установлен ли ротор? И соединение пыталось подключиться на ipv4?Вместо ipv6 –

+0

Вы можете увидеть, есть ли какие-либо переменные среды, присутствующие в вашем поле CentOS6, которые не находятся в вашем окне CentOS7. Вы можете протестировать это в Apache с помощью скрипта cgi-bin printenv, или вы можете найти/разработать версию PHP. – chuck

+0

Я проверил все env, и все в порядке. Я думаю, что это не повод сделать ошибку –

ответ

0

У меня была такая же проблема.

Причина в том, что новые версии Apache.httpd по умолчанию имеют свойство systemd PrivateTmp, установленное в true. Это заставляет службу httpd видеть приватную/tmp-директорию, которая фактически отображается в другое место в файловой системе вместо реального/tmp-каталога. PHP, работающий в Apache-процессе, имеет тот же каталог/tmp, что и служба Apache, а также любые процессы, созданные из PHP (например, с помощью exec или system и т. Д.). Поэтому, когда PHP вызывает qsub (и т. Д.), Это тоже увидит каталог private/tmp.

Это вызывает ошибку, о которой вы говорили, поскольку qsub внутренне использует гнездо unix /tmp/trqauthd-unix для связи с trqauthd. Но qsub видит «поддельный»/private/tmp каталог вместо реального, поэтому он не находит сокет.

Это объясняет, почему команда работает, когда вы запускаете ее вручную в консоли - в этом случае qsub видит каталог real/tmp, а не частный, который видит при форкировании с PHP (работает служба Apache) ,

Одним из решений является простое изменение свойства PrivateTmp в файле httpd.service от true до false. Вы можете найти этот файл в каталоге /etc/systemd. Вложенное это в, вероятно, зависит от дистрибутива, поэтому используйте команду find, чтобы найти его:

find /etc/systemd -name httpd.service