如何将 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 installing 时使用--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.sondependencies 字段,因为我不知道--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?

如何将活动WebSocket传递给Node.js中的集群线程?

如何找到 node.js websocket 消息的连接?

node.js Websocket实现扫码二维码登录---GoEasy