【问题标题】:How to connect socket.io through a reverse proxy如何通过反向代理连接 socket.io
【发布时间】:2014-05-20 02:25:15
【问题描述】:

我正在尝试从 apache 反向代理后面连接到 socket.io 服务器。我在端口 8888 上运行 apache。nodejs 服务器在端口 9096 上的同一台机器上运行。为了测试代理在我的本地机器上配置如下:

ProxyPass /some/path http://localhost:9096
ProxyPassReverse /some/path http://localhost:9096

在客户端代码中,我执行以下操作:

var socketUrl = 'http://localhost:8888/some/path/namespace';
var socket = io.connect(socketUrl);

这会导致以下行为。

首先,我的客户在以下位置请求 socket.io.js 脚本:

http://localhost:8888/some/path/socket.io/socket.io.js
-> 200 ok

然后套接字尝试连接:

localhost:8888/socket.io/1?123983759
-> 404 not found

我找到了 socket.io 的“资源”配置,但这似乎只设置为从中获取 socket.io.js 脚本的位置,而不是它试图连接的 url。它似乎总是连接到客户端源的根目录。

我怎样才能让它连接到 localhost:8888/some/path/socket.io/1?123983759

?

【问题讨论】:

    标签: node.js apache sockets proxy reverse-proxy


    【解决方案1】:

    在您的客户端代码中,您必须使用资源选项设置基本路径,如下所示:

    var socket = io.connect('http://localhost:8888', {resource: '/some/path/socket.io'});
    

    【讨论】:

    • 好的,现在它尝试连接到似乎是正确的 url。握手已完成,但请求 (socket.io/1?t=123983759) 状态现在为“已取消”。如果我在浏览器中使用相同的 url,它只会毫无问题地返回类似“xrf021YGWWEF5NUHoyTD:60:60:websocket”的内容。我不知道发生了什么。
    • 与“握手”我的意思是 nodejs 打印“信息 - 握手授权 05T-Uzt9CmK4SrN8sPQJ”
    • 我得到了它的工作,但不记得为什么我遇到了取消的问题。我认为这与我的反向代理设置有关,而不是 socket.io 设置。对于 socket.io 1.0 版,资源选项已替换为“路径”。发现这很有帮助blog.seafuj.com/migrating-to-socketio-1-0
    • 这对我来说不合适...仍在尝试获取example.com/socket.io...。
    • 资源是否已更改为“路径”? socket.io/docs/client-api -- 您的出色建议使我找到了这个解决方案。请注意,我能够消除“localhost:8888”部分。非常感谢您的分享。
    【解决方案2】:

    我自己也遇到过这个问题,YED 的示例仍然指出了一种直接连接到 nodeJs 而不是通过反向代理的解决方案。

    通常您希望 index.html 通过 Apache 反向代理而不是直接连接。 Socket.io via Apache Reverse Proxy提供了一个示例

    基本上,您还必须启用 proxy_wstunnel 并将以下内容添加到您的虚拟主机配置中

    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*)           ws://dev-ip-machine:8001/$1 [P,L]
    
    ProxyPass /chat http://dev-ip-machine:8001
    ProxyPassReverse /chat http://dev-ip-machine:8001
    ProxyPass        /socket.io  http://dev-ip-machine:8001/socket.io
    ProxyPassReverse /socket.io  http://dev-ip-machine:8001/socket.io
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2019-09-05
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多