nginx 作为 NodeJS+socket.io 的代理:客户端未收到通知
Posted
技术标签:
【中文标题】nginx 作为 NodeJS+socket.io 的代理:客户端未收到通知【英文标题】:nginx as a proxy for NodeJS+socket.io: client not receiving notifications 【发布时间】:2013-05-20 14:10:32 【问题描述】:我已将 nginx 配置为像这样代理 websocket:
location /socket.io
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
客户端连接正常,但是当服务器发出通知时:
io.sockets.emit("update",data);
客户端永远不会收到它:
var socket = io.connect("http://" + hostip + "/socket.io");
socket.on("update",function(data)
console.log("got update: " + data);
);
如果我绕过 nginx,一切都会按预期工作:
var socket = io.connect("http://" + hostip + ":8000");
socket.on("update",function(data)
console.log("got update: " + data);
);
我错过了什么?顺便说一句,为什么绕过 nginx 不是违反单一来源策略?谢谢。
【问题讨论】:
【参考方案1】:在浏览器中尝试var socket = io.connect(location.host);
。我认为您不需要 /socket.io
路径。
【讨论】:
是的,我正在运行 nginx 1.4.1 我的代码与您的链接答案相同。客户端连接正常,服务器将有关客户端心跳的调试记录到控制台,它在发出“更新”但客户端从未收到它时记录。 路径中的/socket.io是一个虚拟位置,nginx按照配置映射到localhost:8000。 是的,我知道,但是 socket.io 的路径是硬编码的。只需连接到根,socket.io 就会自动获取到像/socket.io/1/websocket/FDzfeZaDH_tuk7bulcz5
这样的 URL。
感谢彼得,这解决了问题。我将不胜感激。正如您所说,似乎 io.connect() 调用正在将 /socket.io 添加到 url,这解释了为什么 nginx 将其正确路由到我的 socket.io 服务器。鉴于此,当我在 url 中有 /socket.io 时,io.connect() 会生成与 location.host 相同的 GET URL,为什么它不起作用?
我满怀感激地跪倒在你的脚下!终于,我的配置完成了!以上是关于nginx 作为 NodeJS+socket.io 的代理:客户端未收到通知的主要内容,如果未能解决你的问题,请参考以下文章