使用 Socket.IO 的 NGINX 配置

Posted

技术标签:

【中文标题】使用 Socket.IO 的 NGINX 配置【英文标题】:NGINX configuration to work with Socket.IO 【发布时间】:2012-03-11 12:10:20 【问题描述】:

所以我一直试图让它工作 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】:

更新答案

我终于找到了一种方法来让它发挥作用。这一点都不明显,但是当在子文件夹上托管 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 不想在子文件夹上工作的问题。我敢打赌,如果你放弃 /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 以及当它到达根目录时哪个将发送到套接字 io ? =___= 啊 现在是的。如果可能,您可以改用子域路由。 socket.domain.com。这对我不起作用,因为我不想再花任何钱购买子域的 SSL 证书。 @denniss 我已经用解决方法更新了我的答案。仍在深入研究以确定这是预期的设计还是要修复的错误。 从 socket.io 1.0 开始,resource: ... path: ... 取代

以上是关于使用 Socket.IO 的 NGINX 配置的主要内容,如果未能解决你的问题,请参考以下文章

使用 Nginx 的 socket.io 出现 CORS 错误

使用 socket.io + nginx 时,出现 400 错误,无法通信

Nginx 在 /socket.io 请求上返回 400

基于socket.io +koa2 +天行机器人 实现简单人机实时通讯(nginx处理socket.io https代理问题)

带有 nginx 负载平衡器问题的 Socket.IO 集群

nginx 作为 NodeJS+socket.io 的代理:客户端未收到通知