【问题标题】:nginx as a proxy for NodeJS+socket.io: client not receiving notificationsnginx 作为 NodeJS+socket.io 的代理:客户端未收到通知
【发布时间】: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 不是违反单一来源策略?谢谢。

【问题讨论】:

    标签: node.js nginx websocket socket.io


    【解决方案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,为什么它不起作用?
    • 我满怀感激地跪倒在你的脚下!终于,我的配置完成了!
    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 2013-12-15
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    相关资源
    最近更新 更多