通过 HTTP 发送请求时 ZeroMQ 不工作

ZeroMQ not working when sending request over HTTP

我有一个使用 ZermoMQ 将消息推送到服务器的 WebSocket 服务器(修改后的 Ratchet)。最近我将服务器迁移到了新的 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

我是否遗漏了代码中的某些内容,或者这可能是服务器配置问题?

经过多日的调试,问题落在了 SELinux 上。

当 SELinux 处于 enforcing 模式时,ZeroMQ 连接似乎被拒绝。

对于遇到此类问题的任何人,您需要禁用 SELinux:

sudo setenforce 0