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

时间:2014-04-07 17:34:34

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

我正在尝试从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。它似乎总是连接到客户端的根目录。

我怎么能连接到它 本地主机:8888 /一些/路径/ socket.io / 1 123983759

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:0)

我自己也有这个问题,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