如何通过反向代理连接socket.io

13

我正试图从一个apache反向代理后面连接到一个socket.io服务器。我的apache运行在8888端口。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的“resource”配置,但这似乎只设置了socket.io.js脚本获取的位置,而不是它尝试连接的URL。 它似乎总是连接到客户端源的根目录。 我该如何使其连接到localhost:8888/some/path/socket.io/1?123983759?
2个回答

13
在您的客户端代码中,您需要使用资源选项设置基本路径,像这样:

在您的客户端代码中,您需要使用资源选项设置基本路径,像这样:

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

好的,现在它尝试连接到似乎是正确的URL。握手已经完成,但请求(socket.io/1?t=123983759)的状态现在是“取消”。如果我在浏览器中使用相同的URL,它会简单地返回类似于“xrf021YGWWEF5NUHoyTD:60:60:websocket”的内容,没有任何问题。我不知道发生了什么事情。 - Thijs Koerselman
我所说的“握手已完成”是指Node.js打印出“info - handshake authorized 05T-Uzt9CmK4SrN8sPQJ”。 - Thijs Koerselman
1
我已经让它工作了,但是不记得为什么会遇到取消的问题。我认为这与我的反向代理设置有关,而不是socket.io的设置。对于socket.io版本1.0,资源选项已被“路径”取代。发现这篇文章很有帮助http://blog.seafuj.com/migrating-to-socketio-1-0 - Thijs Koerselman
这对我不起作用...仍在尝试获取http://example.com/socket.io.... - Egidi
2
资源已更改为“路径”吗?https://socket.io/docs/client-api/ - 您出色的建议引导我找到了这个解决方案。请注意,我能够消除“http://localhost:8888”部分。非常感谢您的分享。 - edwardsmarkf

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接