通过 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 测试构建步骤?