【问题标题】:CodePipeline + Beanstalk Connection Refused React + Express AppsCodePipeline + Beanstalk 连接拒绝 React + Express 应用程序
【发布时间】:2021-01-06 22:53:33
【问题描述】:

下面我会详细介绍:

目标

一个 React 前端游戏,使用 socket.io 在 Express 服务器上的玩家之间传输游戏状态数据。

设置

在发现在 Amplify 实例上同时使用 React/Express 是不可能的/真正的解决方法后,我决定迁移到 CodePipeline + CodeDeploy 到 Beanstalk。

我有来自 GitHub 的源,一个 CodeBuild 步骤,然后是 CodeDeploy。 CodeBuild 基本上应该只根据我下面的buildspec.yml 进行编译:

version: 0.2
  frontend:
    phases:
      preBuild:
        commands:
          - npm ci
      build:
        commands:
          - npm run build
   artifacts:
     baseDirectory: build
     files:
       - '**/*'
   cache:
     paths:

虽然这是调用 npm run build,但我不确定 A) CodeBuild/CodeDeploy 将尝试使用 node start 或 B) 如果这将启动我在 package.json 中构建的 react-scripts:

"scripts": {
    "webpack": "webpack --production",
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },

我假设我希望它在 CodeBuild 中构建 webpack 包,然后 CodeDeploy 将调用正确的运行命令,但它似乎是黑盒?还有其他配置文件吗?

运行时错误

虽然我的 server.js 文件默认为 localhost 和 8080,但我收到 Connection Refused:

var hostname = process.env.IP || 'localhost';
var port = process.env.PORT || 8080;

Web.std.out.log:

Sep 20 18:10:10 ip-172-31-41-5 web: > MyApp@0.1.0 start /var/app/current
Sep 20 18:10:10 ip-172-31-41-5 web: > react-scripts start
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: Project is running at http://172.31.41.5/
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: webpack output is served from
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: Content not from webpack is served from /var/app/current/public
Sep 20 18:10:12 ip-172-31-41-5 web: #033[34mℹ#033[39m #033[90m「wds」#033[39m: 404s will fallback to /
Sep 20 18:10:12 ip-172-31-41-5 web: Starting the development server...

Ngnix 错误日志:2020/09/18 03:07:30 [error] 4436#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.31.40.133, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "172.31.41.5"

很多活动部件,所以我确定这里有几个失误,不确定哪个是哪个。

【问题讨论】:

  • 排查问题的第一步,检查是否可以在没有 CodePipeline 的情况下成功部署应用。只是普通的 Elastic Beanstalk。
  • 我可以在本地运行 npm buildserve -s build 但 Beanstalk 失败。
  • 这可能是它,来自独立的 Beanstalk 日志:[ERROR] An error occurred during execution of command [app-deploy] - [check Procfile]. Stop running the command. Error: node.js may have issues starting. Please provide a package.json file or add server.js/app.js file in source bundle
  • EB 将查找 package.json 文件。如果您想使用其他命令来启动您的应用程序,您可以在Procfile 中提供您自己的命令。由于 cmets 的空间有限,我必须提供一个答案才能写更多细节。

标签: reactjs express socket.io amazon-elastic-beanstalk


【解决方案1】:

基于 cmets。

default EB 将寻找package.json 来运行您的应用程序。如果它丢失,将使用package.json 中的script 选项来启动您的应用程序。例如,如果您启动 EB 提供的示例 node.js 应用程序,则文件为:

package.json

{
  "name": "Elastic-Beanstalk-Sample-App",
  "version": "0.0.1",
  "private": true,
  "dependencies": {},
  "scripts": {
    "start": "node app.js"
  }
}

如果您不提供package.jsonProcfile(其他选项,请参见下文),EB 将期望app.jsserver.js 在场以启动您的申请。

如果您不想使用package.json,也可以使用Procfile 告诉EB 如何启动您的应用程序。

当您不提供 Procfile 时,如果您提供 package.json 文件,Elastic Beanstalk 会运行 npm start。如果您也没有提供,Elastic Beanstalk 会按此顺序查找文件 app.js 或 server.js 并运行它。

你的例子可能是

web: serve -s build

【讨论】:

  • 我能够在eb-engine.log 中确认 Procfile 正在被占用,并且我为前端/后端指定的两个进程已运行。在输出日志之前可能导致它失败的唯一其他错误是The deployment didn't install a specific Node.js version。我是否需要始终在package.json 中指定这个?我很惊讶它不会自动安装设置 EB 时指定的 Node 平台版本。
  • 现在我在第一个进程中遇到了一个错误,See "systemctl status web.service" and "journalctl -xe" for details.。访问这些控制命令可能很困难,因为我在连接到我的 EC2 实例时遇到了问题。进程命令为web: serve -s build
  • @A13X 连接到 EC2 实例有什么问题?对于节点版本,也许您在某个地方设置为您的环境使用非默认版本?
  • @A13X 顺便说一句。如果您觉得我的回答有帮助,我们将不胜感激在宽限期结束前接受。
  • 本地我一直在使用 12.16.1,我将它添加到 package.json 并且该错误似乎已经清除。但是现在第一个进程出错了,可能是因为我没有以某种方式安装serve
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 2020-09-05
  • 2023-03-10
  • 2012-11-06
  • 2021-04-14
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
相关资源
最近更新 更多