如何将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
属性集,我只是用我自己的。 另外,它似乎没有这么做,我会继续寻找。
- 在Elastic Beanstalk上使用mongoDB部署Node.Js应用程序时出现错误
- AWS beanstalk nodejs多核
- AWS Elastic Beanstalk运行Grunt任务
- 什么是处理node.js私有模块依赖关系的推荐方式?
- Amazon Elastic Beanstalk节点和npm非标准安装位置
- 无法findpackage.json。 Node.js可能有问题开始。 validationpackage.json是否有效,或将代码放在名为server.js或app.js的文件中
- 如何重置AWS Elastic Beanstalk上的凭证
- AWS弹性beanstalk部署因ENOMEM错误而失败
- 存储在AWS EB环境variables中的JSON将不带引号地进行检索