Php 树莓皮棘轮网套

Php 树莓皮棘轮网套,php,security,nginx,websocket,ratchet,Php,Security,Nginx,Websocket,Ratchet,我用ratchet写了一个websocket。该Web服务器是nginx,并且使用树莓皮。raspberry pi通过端口转发通过路由器连接到互联网。当我在工作中访问该站点时,所有操作都很好。websocket连接,所有网页启动。当我尝试在工作之外访问网页时,除了websocket之外,其他网页都能正常工作。最糟糕的是,我甚至无法调试它,因为我需要在本地网络之外,websocket才能失败(即不工作)。在工作中,我可以使用两个IP地址连接到服务器,一个是只能在本地访问的私有IP地址,另一个是可以

我用ratchet写了一个websocket。该Web服务器是nginx,并且使用树莓皮。raspberry pi通过端口转发通过路由器连接到互联网。当我在工作中访问该站点时,所有操作都很好。websocket连接,所有网页启动。当我尝试在工作之外访问网页时,除了websocket之外,其他网页都能正常工作。最糟糕的是,我甚至无法调试它,因为我需要在本地网络之外,websocket才能失败(即不工作)。在工作中,我可以使用两个IP地址连接到服务器,一个是只能在本地访问的私有IP地址,另一个是可以从任何地方访问的公共IP地址。两个IP地址都正确启动websocket。当我不工作时,我只能访问公共IP地址上的webserver,websocket不工作

我已经连续一天半试图使这项工作成功,但没有成功。有人有什么建议吗?甚至帮我找出问题

websocket代码遵循Ratchet推送服务器教程:

    <?php
       require '/var/www/html/vendor/autoload.php';

       $loop = React\EventLoop\Factory::create();
       $pusher = new MyApp\Pusher;

       $context = new React\ZMQ\Context($loop);
       $pull->bind('tcp://127.0.0.1:5555');
       $pull->on('message',array($pusher, 'onBlogEntry'));

       $webSock = new React\Socket\Server($loop);
       $webSock->listen(443, '0.0.0.0');
       $webServer = new Ratchet\Server\IoServer(
           new Ratchet\Http\HttpServer(
               new Ratchet\Websocket\WsServer(
                   new Ratchet\Wamp\WampServer(
                       $pusher
                   )
               )
           ),
           $webSock
       );
       $loop->run();
    ?>

我怀疑这是一个安全设置问题,因为当我在工作现场时,公共和私人IP地址都可以工作。

这是我自己问题的一个很晚的答案,但以防有人仍然对相同的问题感到困惑。答案是不要使用棘轮。将nodejs与socket.io一起使用。你所有的烦恼都会烟消云散。同样有java实现的Socket.io只是一个更为成熟的WebSocket包。

这是对我自己问题的一个很晚的回答,但以防有人仍然对同样的问题感到困惑。答案是不要使用棘轮。将nodejs与socket.io一起使用。你所有的烦恼都会烟消云散。同样具有java实现的Socket.io只是WebSocket的一个更为发达的包。

var conn=new ab.Session('ws://privateIPAddress:443',
必须是您的
publicIPAddress
如果我用我的公共IP地址替换该行,浏览器无法连接到Web服务器,无论我是否在本地网络或公共网络@cmorrissey上,这似乎是一个合理的解决方案,但随后出现了其他问题。你是对的,这是问题的一部分问题。但是现在如何使websocket与公共IP地址一起工作?也许可以尝试将
$webSock->listen(443,'0.0.0');
更改为
$webSock->listen(443);
var conn=new ab.Session('ws://privateIPAddress:443',
必须是您的
publicIPAddress
如果我用我的公共IP地址替换该行,浏览器无法连接到Web服务器,无论我是否在本地网络或公共网络@cmorrissey上,这似乎是一个合理的解决方案,但随后出现了其他问题。你是对的,这是问题的一部分问题。但是现在如何使websocket与公共IP地址一起工作?也许可以尝试将
$webSock->listen(443,'0.0.0');
更改为
$webSock->listen(443);
    var conn = new ab.Session('ws://privateIPAddress:443',
        function (){
            console.log("Here");
            conn.subscribe('client',function(topic,data) {
                console.log("hey");
                ...
            });
        },
        function() {
            console.warn('Websocket connection closed');
        },
        {'skipSubprotocolCheck': true}
    );