我正在尝试从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
答案 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