【问题标题】:Pass environment variable through PM2 to NextJS通过 PM2 将环境变量传递给 NextJS
【发布时间】:2020-03-05 08:28:05
【问题描述】:

我有 2 个类似这样的 package.json 脚本:

"start": "next start -p $PORT",
"pm2_staging": "pm2 restart ecosystem.config.js --env staging",

还有一个看起来像这样的ecosystem.config.js

module.exports = {
  apps: [
    {
      name: 'test.co.uk',
      script: 'npm',
      args: 'start',
      env_staging: {
        API: 'staging',
        NODE_ENV: 'production',
        PORT: 3001,
      },
    },
  ],
};

然后我运行以下命令:

TEST_VAR='test' npm run pm2_staging

我预计会发生以下情况:

  • PM2 重启命令触发
  • ecosystem.config.js 触发 npm start 命令并设置一些环境变量
  • 应用启动并且所有环境变量都可用,包括TEST_VAR(在原始命令中设置)

实际发生的情况是生态系统中的所有环境变量都已正确设置,但 TEST_VAR 在应用程序中不可用。为什么会这样?如果我不能从 CI 工具设置密钥,我该如何设置?

【问题讨论】:

    标签: shell npm next.js pm2


    【解决方案1】:

    今晚我遇到了同样的问题。在查看了我发现所需配置的每个地方之后。 env 变量需要进入您的ecosystem.config.js,如下所示。就我而言,我将它放在服务器的根目录

      module.exports = {
      apps : [{
        name: 'nextjs',
        script: 'yarn',
        args:"start",
        cwd:"/var/www/myapp/",
        instances: 2,
        autorestart: true,
        watch: false,
        max_memory_restart: '1G',
        env: {
          NODE_ENV: 'development'
        },
        env_production: {
          NODE_ENV: 'production',
          API_URL: 'YOUR ENV URL',
          PORT:8000
        }
      }]
    };
    

    package.json 喜欢这样

    "scripts": {
        "dev": "next",
        "build": "next build",
        "start": "next start -p 8000"
      },
    ...
    

    并执行了类似的操作

    #!/bin/bash
    cd /var/www/myapp/
    git pull && yarn install && yarn build
    cd ~/
    pm2 start ecosystem.config.js --env production
    

    然后API_URL 将在您的应用程序中的const API_URL = process.env.API_URL 中可用。 这些网址有帮助 https://willandskill.se/en/setup-a-next-js-project-with-pm2-nginx-and-yarn-on-ubuntu-18-04/ https://pm2.keymetrics.io/docs/usage/application-declaration/

    【讨论】:

      【解决方案2】:

      另一个想法是通过以下方式将 PM2 的 allenv 参数传递给服务器。

      ecosystem.config.js 是:

      module.exports = {
          apps: [{
              name: "my-service-1",
              script: "dist/server.js",
              env_production: process.env, // pass all the env params of the container to node
          }],
      };
      

      【讨论】:

        【解决方案3】:

        @webface

        示例中的环境变量在 Nextjs 中不可用。要对客户端和服务器都可用,变量必须以 NEXT_PUBLIC 为前缀(即 NEXT_PUBLIC_API_VERSION)。

        这些环境变量必须传递到构建过程中才能在运行时使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-27
          • 1970-01-01
          • 2020-07-26
          • 2019-01-07
          • 1970-01-01
          • 1970-01-01
          • 2013-12-29
          相关资源
          最近更新 更多