我有一个WebSocket服务器(修改过的Ratchet),它使用ZermoMQ将消息推送到服务器。最近我将服务器迁移到了新的VPS上。
实现是相同的,但由于某种原因,当我通过HTTP请求PHP脚本时,ZeroMQ不会将有效负载发送到WebSocket服务器,但是当我通过终端运行脚本时,它可以工作。
这是获取要发送到Websocket服务器的新请求的脚本:
<?php
if(isset($_POST['identity'], $_POST['identifier'], $_POST['env'], $_POST['action'], $_POST['payload'])){
$identity = $_POST['identity'];
$identifier = $_POST['identifier'];
$env = $_POST['env'];
$action = $_POST['action'];
$payload = $_POST['payload'];
$context = new ZMQContext();
$client = $context->getSocket(ZMQ::SOCKET_PUSH, 'ICU push');
$client->connect('tcp://127.0.0.1:21002');
$client->send(json_encode(array('identity' => $identity, 'env' => $env, 'message' => formatRequest($identifier, $action, $payload))));
} else {
echo "Invalid request";
exit;
}
服务器启动脚本:
<?php
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../autoload.php');
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\Wamp\WampServer;
use ICU\Server;
use ICU\Logger;
$logger = new Logger();
$logger->setInteractive(true);
$loop = React\EventLoop\Factory::create();
$server = new Server('test');
$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind("tcp://127.0.0.1:21002");
$pull->on('message', array($server, 'onNewRequest'));
$logger->info("ZMQ listening on TCP 127.0.0.1:21002");
$webSock = new React\Socket\Server($loop);
$webSock->listen(21001, '0.0.0.0');
$webServer = new IoServer(
new HttpServer(
new WsServer(
new WampServer(
$server
)
)
),
$webSock
);
$logger->info("ICU Server listening on 0.0.0.0:21001");
$loop->run();
HTTP请求本身不会失败。响应代码为200,错误日志中没有错误。此外,当回显整个脚本时,我看到脚本完全执行但ZeroMQ不会将它发送到Websocket服务器。
我查看了netstat
,端口21001和21002正在运行和收听。此外,我为两者添加了iptables
条目(尽管21001应该足够,因为ZeroMQ仅用于本地级别,但以防万一)。
这是一个CentOS 7服务器,我安装了libzmq以及zmq pecl扩展。
$ php -i | grep "zmq"
/etc/php.d/zmq.ini
zmq
libzmq version => 4.1.3
我的代码中是否遗漏了某些内容,或者这可能是服务器配置问题?
答案 0 :(得分:1)
经过多天的调试,问题落到了SELinux上。
当SELinux处于{{}}
模式时,似乎拒绝了ZeroMQ连接。
对于遇到此类问题的任何人,您需要禁用SELinux:
enforcing