php - websockets 连接因 apache 和 Ratchet 而失败

标签 php apache websocket ratchet

我使用库 Ratchet 编写了一个 php websockets 服务器我使用 websocket object 用 javascript 调用.

一切都在本地完美运行,但无法在我的 Debian 服务器上的 apache 下运行我的项目。

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

<VirtualHost *:80>
        ServerAdmin admin@admin.admin
        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();

然后,当我尝试在 javascript 客户端使用 url ws://api.domain.com:8888/wss/homews/ 连接到它时,我总是得到 错误连接建立:net::ERR_CONNECTION_TIMED_OUT

您知道我该如何调试此类错误吗? apache 上是否有任何日志显示配置错误?

最佳答案

您的上述配置至少必须更改为:

<VirtualHost *:80>
        ServerAdmin admin@admin.admin
        DocumentRoot /var/www/api.domain.com
        ServerName api.domain.com

        # Enable Websocket connections on port 8888
        ProxyPass "/wss/homews/" "ws://localhost:8888/wss/homews/"

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

并且在 javascript 客户端到 url ws://api.domain.com:80/wss/homews/

否则可能(或者希望服务器设置)来自网络服务器配置的目标 api.domain.com:8888 试图在 websocket 绑定(bind)时到达服务器公共(public) IP 上的 websocket 上游到本地主机。第八,它只是不在那里听(这很好,因为您通常只想向公众公开您的网络服务器端口,而不是直接向您的应用程序端口公开)或者更糟糕的是,它试图到达一个公共(public) NAT IP,这涉及到防火墙的访问端口 8888 应该被阻止,这可能不允许这些东西,可能很昂贵(例如 AWS EC2)并且至少性能不佳。

另一方面,您将希望将客户端代码定向到端口 80 上的网络服务器,该端口将隧道连接到您的 websocket 应用程序,因此您的客户端无法直接访问服务器的端口 8888(希望它在公共(public)防火墙中被阻止 - 并且您仅在本地主机上收听)。

尝试使用您的原始设置并说明结果如何变化,也许还有其他问题(但您至少不应再获得套接字超时以及从客户端到 websocket 应用程序的连接)。

关于php - websockets 连接因 apache 和 Ratchet 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58384112/

相关文章:

apache - 尝试修复时出错

javascript - 使用 Jasmine 测试 Web 套接字

php - Laravel 4 - Eloquent 。无限的 child ​​变成可用的数组?

php - PHP Web 应用程序的页面加载

macos - 如何 : Set up a Virtual Host on Apache 2. 4.4 [MAC/*NIX]

php - 尝试在 Linux 中通过 PHP 使 apache 运行 Python 时出现权限被拒绝错误

php - Web 浏览器上的日语字符编码问题

php - 您将如何实现类似于 SO 的徽章系统?

android - Slack 实时消息传递 websocket

javascript - AngularJS 和 Websocket