使用 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 错误,无法通信
基于socket.io +koa2 +天行机器人 实现简单人机实时通讯(nginx处理socket.io https代理问题)