websockets连接因apache和棘轮而失败

问题描述 投票:2回答:1

我使用库Ratchet编写了一个php websockets服务器,该库我使用websocket object和javascript进行了调用。

在本地,一切正常,但是无法在Apache下的Debian服务器上运行我的项目。

为了启用websocket连接,我读到必须使用mod_proxy_wstunnel模块。因此,我为子域api.domain.com重写了我的apache conf,如下所示:

<VirtualHost *:80>
        ServerAdmin [email protected]
        DocumentRoot /var/www/api.domain.com
        ServerName api.domain.com

        # Enable Websocket connections on port 8888
        ProxyPass "/wss/homews/" "ws://api.domain.com:8888/"

        <Directory /var/www/api.domain.com>
                Options FollowSymLinks
                AllowOverride All
                Order allow,deny
                Allow from all
                Satisfy all
        </Directory>
</VirtualHost>

然后,我用启动Ratchet Websocket服务器的这段代码来调用我的PHP脚本:

// ...
// Some code ...
$app = new Ratchet\App('localhost', 8888);
$app->route('/wss/homews/', $myClass, array('*'));
$app->run();

然后,当我尝试通过url ws://api.domain.com:8888/wss/homews/在javascript客户端上连接到它时,我总是得到Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT

您有什么想法我该如何调试这种类型的错误? apache上是否有显示配置错误的日志?

php apache websocket ratchet
1个回答
1
投票

最重要的是,尝试简化操作,请勿编辑或触摸服务器上的任何配置文件,默认情况下将其保留,可以使用

我将张贴所有必要的预防措施,以使套接字正常运行,请按一个步骤进行操作,如下所示:

  1. 检查服务器是否在共享主机上支持Web Socket,否则,您可能需要使用专用主机服务或虚拟专用服务器(VPS),例如:AWS,GCP。如果您的服务器支持在Web服务中运行phpwebsocket之类的Web服务脚本,请执行以下步骤

  2. 在终端上,将作曲家更新到最新版本,然后尝试执行$composer require cboden/ratchet这样所需的依赖项将有效地加载,并且不要尝试上传任何已存档的依赖项。就我而言,"cboden/ratchet": "^0.4.3"已加载在本地主机上,但在生产站点上是"cboden/ratchet": "^0.4.1"composer.json文件进行比较时

  3. 尝试连接到端口8282,在大多数情况下,入站和出站的服务器流量默认情况下保持打开状态,以防端口8080无法绑定到TCP

  4. 最后,尝试重新启动您的云托管服务器实例并执行websocket脚本$php <yourWebSocketScript.php>

我曾经使用mod_proxy_wstunnel来确保通信经过加密,我能够顺利地在AWS和我们的专用服务器上启动并运行Websocket socketo.me

[[感谢您的联系,我非常感谢您的努力,除了您通过johannchopin @ protonmaildotcom进行回复的相关评论,这不属于我的商业道德


编辑

$app = new Ratchet\App('localhost', 8888); $app->route('/wss/homews/', $myClass, array('*')); $app->run();
尝试从yourWebSocketScript.php更改您的本地主机

$server = IoServer::factory( new HttpServer(new WsServer(new Chat())), 8282 ); $server->run();

尝试绑定到HttpServer,默认为localhost0.0.0.0并运行(如果需要,请消除$app->route()

注意:代码中的任何细微更改,您都需要通过终止特定于所分配端口号的进程来重新启动正在运行的Websocket脚本$php <yourWebSocketScript.php>

© www.soinside.com 2019 - 2024. All rights reserved.