【问题标题】:React build run on server using pm2使用 pm2 在服务器上运行 React 构建
【发布时间】:2018-10-12 22:32:18
【问题描述】:

我已经编译了我的 react 应用程序使用

react-scripts build

它在App的根目录下生成了一个build\文件夹。 我正在使用

运行 build\ 文件夹
sudo serve -T -p 443 build/

这会在 HTTPS 上成功运行我的 React 应用程序,因为我传递了 -T。但是我需要使用任何可用的模块来永远运行我的应用程序。我正在研究节点模块 foreverpm2。 我正在尝试通过以下方式使用 pm2:

sudo pm2 serve -T -p 443 build/

它抛出:

error: unknown option `-T'

当我使用时:

sudo pm2 serve -p 443 build/

它可以在控制台上运行,但我无法从 URL 访问我的应用程序

[ec2-user@ip-10-XXX-XX-XXX UI]$ sudo pm2 serve -p 443 build/
[PM2] Spawning PM2 daemon with pm2_home=/root/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /usr/local/lib/node_modules/pm2/lib/API/Serve.js in fork_mode (1 instance)
[PM2] Done.
[PM2] Serving /var/www/html/UI/build on port 8080
┌─────────────────────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name                │ id │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user │ watching │
├─────────────────────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ static-page-server-8080 │ 0  │ fork │ 26609 │ online │ 0       │ 0s     │ 2%  │ 21.7 MB   │ root │ disabled │
└─────────────────────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
 Use `pm2 show <id|name>` to get more details about an app

有人可以帮我解决这个问题吗? 或者,如果有任何其他方式可以在生产环境中永久运行您的 react 应用程序。

【问题讨论】:

标签: reactjs pm2 forever serve react-scripts


【解决方案1】:

您需要使用pm2 JSON 配置来运行任意二进制文件:

app.config.json

{
  apps : [
    {
      name      : "your-app",
      script    : "npx",
      interpreter: "none",
      args: "serve -p 8443 -T"
    }
  ]
}

开始:

pm2 start app.config.json

interpreter: "none" 告诉pm2 在执行时不要将脚本视为 JavaScript 文件,而是将其视为普通二进制文件。

如果您在与应用配置相同的目录中有serve 二进制文件,则可以直接执行serve 而不是npx

【讨论】:

  • args: "serve -p 8443 -T" 这个命令告诉应用程序将在 8443 端口上运行?对吗?
  • @ReemaParakh 没错。 script: "npx" 告诉 pm2 执行 npx 命令,args: "serve -p 8443 -T" 将作为参数传递给 npx。所以最终,pm2 将运行 npx serve -p 8443 -T
  • 我不清楚,叫什么名字?在哪里保存这个文件?以及在哪里提供我们的根 app.js 文件?
  • @151291 您应该将此文件与 package.json 文件一起保存在根文件夹中。 name : "your-app" 就像你直接在终端上运行 pm2 pm2 start index.js --name your-app
  • 我认为 pm2 serve 不适用于路由。它只是静态地提供文件,并错误地为目录路径提供路径。
【解决方案2】:

使用下面的命令对我有用

首先构建您的 react 应用程序,然后在您的应用程序文件夹中点击此命令。

pm2 serve build/ 3000 --name "react-build" --spa

【讨论】:

    【解决方案3】:

    @bgran 提供了一个不错的解决方案。作为替代方案,我敢建议您可以将此 deploy 添加到 package.json 中的脚本

    "deploy": "pm2 start ./server.sh --name yourAppName",
    

    然后在package.json的同一目录下,创建一个可执行的server.sh

    echo "Serving yourAppName!"
    serve -s build
    

    不要忘记通过运行使 server.sh 成为可执行文件:

    chmod +x server.sh
    

    现在是聚会时间!通过运行部署您的应用

    npm run deploy
    

    完成!

    【讨论】:

    • 如何才能在此处仅引用“dist”文件夹(包含所有捆绑更改)?
    • 这与之前文件中描述的 app.config.json 结合使用。如果我没有编写自己的 server.sh,它将不会执行。谢谢!
    • 并在 bash 文件的顶部添加 #!/bin/bash
    • 不是一个好的答案。像这样运行 server.sh 会泄漏内存并导致 ec2 实例滞后
    【解决方案4】:

    创建 run.sh 文件

    将下面的命令放入run.sh文件中

    服务 -s 构建

    然后保存。

    然后运行这个命令。

    sudo pm2 start run.sh --name app-name

    【讨论】:

      【解决方案5】:

      如果您愿意使用 pm2 运行 React 项目,请尝试在命令下方运行

      pm2 start --name <app name<app name>> npm -- start
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 2020-07-09
        • 2023-03-15
        • 1970-01-01
        相关资源
        最近更新 更多