如何将Node.js WebSocket服务器部署到Amazon Elastic Beanstalk?

使用Elastic Beanstalk Web控制台,我已经启动了一个新的Web Server 1.0环境:

  • 预定义configuration:Node.js,64位Amazon Linux 2014.09 v1.0.9
  • 环境types:负载均衡,自动调节

并将Proxy Server设置为none 。

我已经成功压缩并通过控制台上传我的代码:

的package.json

{ "name": "cool", "version": "0.0.0", "dependencies": { "ws": "0.4.x" } } 

server.js

 var wss = new (require('ws')).Server({port: (process.env.PORT || 3000)}) wss.on('connection', function(ws) { console.log('connected') ws.on('message', function(message) { console.log(message) ws.send(message) }); ws.on('close', function() { console.log('disconnected') }) }) 

我也试过包括node_modules目录。

运行后:

 wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com/ 

我回来了:

 Error: unexpected server response (200) 

我怎样才能find更多关于这个错误?

亚马逊设置PORT环境variables为8080.所以,我也试过:

 wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com:8080/ 

但是,这只是挂起,然后回来:

 Error: connect ETIMEDOUT 

此外,当我build立一个WebSocket连接时,我希望服务器允许它保持打开无限期,不像Heroku的WebSocket实现,在60秒后超时。

有没有关于如何做到这一点的详细教程?

如果你已经正确地设置了你的package.json文件(主要是在npm install时使用--save ),那么你不应该包含node_modules目录。

检查process.env.PORT设置是否不更改已监听的端口 – AWS EB通常将端口设置为8081。

要查找报告的端口,可以在代码中添加console.log(process.env.PORT) ,然后通过ssh连接到服务器,并运行tail -f var/log/nodejs/nodejs.log (监视日志输出node.js)。 然后再次打你的服务器,看看你的SSH连接日志输出中显示的端口。

要调查你正在得到的错误,添加一个ws.on('error',...)函数并logging你想要的。

好吧,经过一番search之后,我find了一个解决scheme,不需要对ELB进行任何更改,也不需要将代理设置为none(我使用nginx)。

所有你需要的是这样的:

  • 在项目的根目录下,创build.ebextensions目录(如果尚不存在)
  • 在那里创build一个文件,我打电话给我的01_nginx.config
  • 在这个文件中,放置下面的代码:container_commands:

     01_nginx_websockets: command: | sed -i '/\s*proxy_set_header\s*Connection/c \ proxy_read_timeout 36000s; \ proxy_set_header Upgrade $http_upgrade; \ proxy_set_header Connection "upgrade"; \ ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 

将您的代码部署到弹性beanstalk并享受连接的websocket!

PS:你真的不需要proxy_read_timeout属性集,我只是用我自己的。 另外,它似乎没有这么做,我会继续寻找。