Heroku 和 Socket.io,400 个错误请求和许多断开连接

Posted

技术标签:

【中文标题】Heroku 和 Socket.io,400 个错误请求和许多断开连接【英文标题】:Heroku and Socket.io, 400 Bad requests and many disconnects 【发布时间】:2015-04-26 03:08:20 【问题描述】:

所以我有一个可以在 socket.io 上运行的应用程序,我正在尝试让它在 Heroku 上运行,但是在运行它时遇到了严重的问题。

在控制台日志和 chrome 控制台中,每隔一秒左右就会有一堆断开连接。在 chrome 控制台中,我不断收到 400 个错误请求。

https://appname.herokuapp.com/socket.io/?api_key=xxx&EIO=3&transport=polling&t=1424782938420-1&sid=hcTvjdxYePd4kNS5AAAe Failed to load resource: the server responded with a status of 400 (Bad Request)
disconnect
WebSocket connection to 'wss://appname.herokuapp.com/socket.io/?api_key=xxx=3&transport=websocket&sid=hcTvjdxYePd4kNS5AAAe' failed: WebSocket is closed before the connection is established.

所以在我的 server.js 中

var cluster = require('cluster');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var redis = require('redis');
var redisAdapter = require('socket.io-redis');

var port = process.env.PORT || 3800;

var workers = process.env.WORKERS || require('os').cpus().length;

var redisUrl = process.env.REDISTOGO_URL || 'redis://rediscloud:pw@url:14599';

var redisOptions = require('parse-redis-url')(redis).parse(redisUrl);
var pub = redis.createClient(redisOptions.port, redisOptions.host, 
  detect_buffers: true,
  auth_pass: redisOptions.password
);
var sub = redis.createClient(redisOptions.port, redisOptions.host, 
  detect_buffers: true,
  auth_pass: redisOptions.password
);

io.set('origins', '*:*');

io.adapter(redisAdapter(
  pubClient: pub,
  subClient: sub
));

console.log('Redis adapter started with url: ' + redisUrl);

/* -------------------------------- */

//APP LOGIC HERE

/* -------------------------------- */

if (cluster.isMaster) 
  console.log('start cluster with %s workers', workers - 1);
  workers--;
  for (var i = 0; i < workers; ++i) 
    var worker = cluster.fork();
    console.log('worker %s started.', worker.process.pid);
  

  cluster.on('death', function(worker) 
    console.log('worker %s died. restart...', worker.process.pid);
  );
  cluster.on('exit', function(worker) 
    console.log('worker %s exited. restart...', worker.process.pid);
    cluster.fork();
  );
 else 
  start();


function start() 
  http.listen(port, function() 
    console.log('listening on *:' + port);
  );

在我的 client.html 中

<script src="https://appname.herokuapp.com/socket.io/socket.io.js"></script>
<script>
var socket = io.connect("https://appname.herokuapp.com",  query: "api_key=xxx" );
</script>

我读过粘性会话可能会导致问题,但大部分信息似乎已经过时,显然 Heroku 现在很好地支持 websockets。

我不是想在多个实例上运行它,这只是用heroku ps:scale web=1 运行

甚至不确定 websocket 是否正常工作,它似乎正在使用轮询,然后也失败了。

所以我的问题是:当它在本地正常工作时,为什么我会收到所有这些断开连接和 400 个错误请求?我该如何解决?

【问题讨论】:

【参考方案1】:

我有同样的问题。解决方案是更改托管。我不想离开heroku,因为它真的很方便。但是在我浪费了大量时间寻找修复程序之后,我尝试将应用程序部署到 OpenShift。 我还添加了修改后的服务器启动,提供了明确的端口和主机(没有它就无法工作!)

var port = process.env.OPENSHIFT_NODEJS_PORT || 8080,
    ip_address = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1';
...
sockets.setupListeners(server);
server.listen(port, ip_address);

您可以在此处enter link description here 第 4 条下找到更多详细信息。

我相信你会解决你的头痛。

【讨论】:

嗯,这很烦人,认为 heroku 被广泛使用。不过谢谢,现在看看 openshift 不完全在那里,但比我在 Heroku 上得到的更远,谢谢@Mihail。似乎还有一些问题,并且似乎没有 redis OOTB,但无论如何都有一些工作:)

以上是关于Heroku 和 Socket.io,400 个错误请求和许多断开连接的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io + NodeJS 不适用于 Heroku

在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*

如何在 Socket.io 中与 Heroku 服务器建立 Socket 连接?

Heroku - Socket.IO 客户端总是连接到本地主机

Websocket 不能在 heroku 中使用 socket.io

Express 4.0 中的 Heroku socket.io 示例错误