如何将 Node.js WebSocket 服务器部署到 Amazon Elastic Beanstalk?
Posted
技术标签:
【中文标题】如何将 Node.js WebSocket 服务器部署到 Amazon Elastic Beanstalk?【英文标题】:How to deploy a Node.js WebSocket server to Amazon Elastic Beanstalk? 【发布时间】:2015-01-06 04:19:31 【问题描述】:使用 Elastic Beanstalk Web 控制台,我启动了一个新的 Web Server 1.0 环境:
预定义配置:Node.js、64 位 Amazon Linux 2014.09 v1.0.9 环境类型:负载平衡、自动缩放并拥有set Proxy Server to 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)
我如何才能找到有关该错误的更多信息?
亚马逊将 PORT 环境变量设置为 8080。所以,我也尝试了:
wscat -c ws://default-environment-xxxxxxxxxx.elasticbeatalk.com:8080/
但是,这只是挂起然后返回:
Error: connect ETIMEDOUT
另外,当我建立 WebSocket 连接时,我希望服务器允许它无限期地保持打开状态,这与 Heroku 的 WebSocket 实现不同,后者会在 60 秒后超时。
是否有详细的教程说明如何做到这一点?
【问题讨论】:
在这里查看我的答案:***.com/questions/35713976/… 我在这里遇到了同样的问题,我很困惑。当我尝试连接我的 websocket 时,Chrome 返回给我的所有内容都是响应代码为 200 (??) 的“错误”,并且数据显示为“(Opcode -1)”。找不到其他东西。任何帮助将不胜感激。 【参考方案1】:如果您正确设置了package.json
文件(主要是在npm install
ing 时使用--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',...)
函数并记录您想要的内容。
【讨论】:
我就是这么想的。我刚刚手动编辑了package.son
的dependencies
字段,因为我不知道--save
。所以,谢谢你的提示! :-)
如何查看process.env.PORT
是什么?我能想到的唯一方法是部署一个简单的 HTTP 服务器来响应process.env.PORT
。然后,我在 Safari 中访问我的应用程序的 URL(未指定端口)并返回 8080,我不明白,因为我告诉服务器监听 process.env.PORT
(8080),而不是 80(默认端口由苹果浏览器)。那么,为什么 Safari 能够通过端口 80 访问我的简单 HTTP 服务器?当我尝试使用指定端口 8080 的 Safari 访问它时,请求只是挂起。我应该在我的代码中为port
指定什么(server.js
的第一行)?
你在EB环境中使用的是nginx还是Apache作为代理?这将侦听端口 80,然后将请求传递到 node.js 在任何已配置的端口上。我注意到您提到您正在使用负载平衡 - 这也会影响端口转换
要找到被报告的端口,你可以尝试在你的代码中做一个console.log(process.env.PORT)
,然后ssh到服务器并运行tail -f var/log/nodejs/nodejs.log
(这会监控node.js的日志输出)。然后点击您的服务器,查看 ssh 连接的日志输出中显示的端口。
两者都不是。我已将“代理服务器”设置为“无”。是的,我正在使用负载平衡。也许我会尝试不使用它。【参考方案2】:
好吧,经过一番搜索或搜索,我找到了一个解决方案,该解决方案无需对 ELB 进行任何更改,也无需将代理设置为无(我使用 nginx)。
你只需要这个:
在项目的根目录中,创建.ebextensions
目录(如果它不存在)
在那里创建一个文件,我叫我的01_nginx.config
在这个文件中,输入以下代码: 容器命令:
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 并享受 websockets 连接!
PS:你真的不需要proxy_read_timeout
属性集,我只是将它用于我自己的。还有,好像没多大作用,我会继续找的。p>
【讨论】:
以上是关于如何将 Node.js WebSocket 服务器部署到 Amazon Elastic Beanstalk?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 node.js 使 Websocket 服务器安全
Node.js HTTP 服务器无法响应 websocket
Unity 如何连接基于 Node.js 的 Secure WebSocket?