NGINX配置与Socket.IO一起使用

时间:2012-02-21 06:35:18

标签: apache node.js unicode nginx socket.io

所以我一直试图让这个工作2天,我被卡住了。这是我第一次为使用NodeJS + Socket IO的rails配置服务器。我是NGINX和Unicorn的菜鸟。基本上我的应用程序的NodeJS + SocketIO部分会将消息推送给连接到我的应用程序的用户。这是我的nginx.conf

server{
    listen 80 default;
    root /home/deployer/saigon/public;
    try_files $uri/index.html $uri @unicorn;

    location /sockets {
        proxy_pass http://localhost:3210;
    }

    location @unicorn {
       proxy_pass http://localhost:3000;
    }
}

在我的production.rb中,我已经配置了用户必须从

发送消息到/接收消息的URL
SOCKET_IO_URL ='http://localhost:8080/sockets

为什么选择8080?我使用Vagrant转发8080 - > 80

我尝试访问http://localhost:8080/sockets并且我能够获得套接字欢迎消息。我查看了我的NodeJS服务器日志,它正在接收消息。然而,当谈到广播.....它只是不这样做。有没有人有这样的应用程序与我正在尝试的设置一起工作?我应该选择Apache + Unicorn吗?

1 个答案:

答案 0 :(得分:13)

更新了答案

我终于想出办法让这个工作。这一点并不明显,但是当在子文件夹上托管socket.io时,不要在connect语句中使用子文件夹。这就是我以前做过的事情,客户端从未收到回复。

不工作

<script src="/test/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080/test/', {resource:'test/socket.io'});
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

http://localhost:8080 / test / 这是放弃一切的部分。这为服务器端不尊重的本地套接字创建了一个命名空间。因此,客户端在名称空间'/ test /'上发送消息,但服务器响应将转到空名称空间'',因此客户端永远不会获取消息。解决方法是简单地删除'/ test /'并确保您在客户端和服务器上使用资源变量。

工作!

<script src="/test/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost:8080', {resource:'test/socket.io'});
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>

我希望这可以帮助你让事情发挥作用。

原始答案

这不是你的设置问题,这是socket.io不想在子文件夹上工作的问题。我敢打赌,如果你放弃了/ socket,你的例子就可以了。当使用http-node-proxy尝试在子文件夹上托管socket.io连接时,我遇到了完全相同的问题。之前有一个错误,但它被关闭了,从未解决过。

https://github.com/LearnBoost/socket.io-client/issues/185

https://github.com/LearnBoost/socket.io/issues/320

我仍在寻找解决方案,但我有一种感觉,我将不得不卷起袖子并自己深入研究代码。