使用Elastic Beanstalk web控制台,我启动了一个新的web Server 1.0环境,其中包含:
- 预定义配置:Node.js,64位Amazon Linux 2014.09 v1.0.9
- 环境类型:负载平衡、自动缩放
并已将"代理服务器"设置为"无"。
我已经成功地压缩了&通过控制台上传我的代码:
软件包.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)
我如何才能了解有关该错误的更多信息?
Amazon将PORT环境变量设置为8080。所以,我也尝试过:
wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com:8080/
但是,它只是挂起,然后又回来了:
Error: connect ETIMEDOUT
此外,当我建立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',...)
函数并记录您想要的内容。
好吧,经过一番搜索,我找到了一个解决方案,它可以在不更改ELB任何内容的情况下工作,也不将代理设置为none(我使用nginx)。
你只需要这个:
- 在项目的根目录中,创建
.ebextensions
目录(如果它还不存在) - 在那里创建一个文件,我称之为
01_nginx.config
-
在此文件中,放入以下代码:container_commands:
01_nginx_websockets: command: | sed -i '/s*proxy_set_headers*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
将您的代码部署到弹性豆茎上,享受网络套接字连接!
附言:你并不真的需要proxy_read_timeout
属性集,我只是把它用于我自己。而且,它似乎没有多大作用,我会继续寻找。