通过 PM2 将环境变量传递给 NextJS

Posted

技术标签:

【中文标题】通过 PM2 将环境变量传递给 NextJS【英文标题】:Pass environment variable through PM2 to 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 工具设置密钥,我该如何设置?

【问题讨论】:

【参考方案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)。

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

【讨论】:

以上是关于通过 PM2 将环境变量传递给 NextJS的主要内容,如果未能解决你的问题,请参考以下文章

如何将环境变量传递给 Jenkins 中的 sbt 测试构建步骤?

无法将环境变量传递给 docker

将预处理器变量传递给 nmake 构建环境

Svelte 框架:在运行时将环境变量传递给客户端包

如何将环境变量传递给 ExternalProject_Add CONFIGURE_COMMAND?

将环境变量传递给 application.yml