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

Hor*_*rse 6 heroku node.js socket.io

所以我有一个适用于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.
Run Code Online (Sandbox Code Playgroud)

所以在我的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);
  });
}
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以我的问题:为什么我在本地工作正常时会收到所有这些断开连接和400个错误请求?我该怎么办?

Mih*_*dev 2

我遇到过同样的问题。解决方案是更改托管。我不想离开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);
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更详细的信息,在第 4 条下输入链接说明

相信你的头痛问题一定能解决。