2012-02-21 114 views
7

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

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,我已经配置了用户将不得不从

SOCKET_IO_URL ='http://localhost:8080/sockets 

为什么8080将消息发送到/接收邮件中的网址?我使用Vagrant转发8080 - > 80

我试图访问http://localhost:8080/sockets,我能够获得套接字欢迎消息。我看着我的NodeJS服务器日志,它正在接收消息。但是,当涉及到广播.....它只是不这样做。有没有人有过这样的应用程序来处理我想要做的设置?我应该和Apache + Unicorn一起去吗?

'

回答

12

更新回答

我终于想出了一个办法来得到这个工作。这一点并不明显,但是当在子文件夹上托管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 /',并确保在客户端和服务器上使用资源变量。

工作!

<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到子文件工作的问题。我敢打赌,如果你放弃了/套接字,你的例​​子可以正常工作。当使用http-node-proxy尝试在子文件夹上托管socket.io连接时,我遇到了完全相同的问题。前段时间创建了一个错误,但它被封闭并且从未解决。

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

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

我仍然在寻找一个解决方案为好,但我有一种感觉,我将不得不挽起了袖子,深入到代码自己。

+0

所以基本上是socket/socket。io需要留在根文件夹然后....这意味着我必须知道哪些请求将导轨,哪些是打到socket的io当它打到根? = ___ = argh – denniss 2012-02-21 18:17:09

+0

现在是。如果可能的话,你可以改用子域路由。 http://socket.domain.com/。这对我不起作用,因为我不想花更多钱在子域的SSL证书上。 – 2012-02-21 21:05:02

+0

@denniss我已经用解决方法更新了我的答案。仍然深入研究,以确定这是预期的设计还是需要解决的错误。 – 2012-02-22 00:00:25