与 Socket.IO 配合使用的 NGINX 配置

7

所以我已经尝试了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个回答

15

更新的答案

我终于找到了一种方法使这个工作起来。这并不明显,但是当将socket.io托管在子文件夹上时,在连接语句中不使用子文件夹。这就是我以前所做的事情,客户端从未收到响应。

不起作用

<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 不想在子文件夹中工作的问题。我敢打赌,如果您去掉 /sockets ,您的示例就会正常工作。当使用 http-node-proxy 尝试在子文件夹上托管 socket.io 连接时,我遇到了完全相同的问题。一段时间以前创建了一个错误,但它已关闭且未得到解决。

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

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

我仍在寻找解决方案,但我感觉我将不得不亲自深入代码。


基本上,socket/socket.io需要留在根目录中... 这意味着当请求命中根目录时,我必须知道哪个请求是发送到Rails,哪个是发送到Socket IO? =___= 烦死了。 - denniss
目前是可以的。如果可能的话,您可以使用子域路由。http://socket.domain.com/。但这对我来说不起作用,因为我不想在子域上再花费更多的钱购买SSL证书。 - Timothy Strimple
@denniss 我已经更新了我的答案并提供了一个解决方法。我还在继续研究,以确定这是否是预期设计或需要修复的错误。 - Timothy Strimple
从 socket.io 1.0 开始,{resource: ... 被替换为 {path: ... - ceremcem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接