如何为pm2传递NODE_ENV=production环境变量?
解决PM2启动Node.js应用时无法加载Production环境配置的问题
我来帮你梳理下问题所在,以及对应的解决方案:
问题核心
你之前的几种尝试都没成功,主要是因为PM2传递环境变量的方式和你预期的不一样,尤其是通过pm2 start npm -- ...这种方式启动时,参数的传递逻辑需要特别注意。
解决方案1:命令行直接指定环境变量(快速解决)
当用PM2启动npm脚本时,要把环境变量放在PM2命令的最前面,而不是start之后。这样环境变量会被PM2进程继承,进而传递给你的Node.js应用:
NODE_ENV=production pm2 start npm -- start
之前你把NODE_ENV=production放在start后面,它会被当成npm start的命令行参数,而不是环境变量,所以应用根本读不到这个值。
解决方案2:使用PM2配置文件(推荐,适合多实例/复杂配置)
你的process.yml配置本身没问题,但启动方式错了——你不该把配置文件当成npm start的参数,而是直接让PM2加载这个配置文件:
首先修正你的process.yml(可以加上应用名称方便管理):
apps: - name: freefeed-server script: npm args: "start" # 告诉PM2执行npm start命令 watch: true instances: 4 env: NODE_ENV: production
然后用以下命令启动:
pm2 start process.yml
这样PM2会读取配置里的环境变量,启动时自动传递给你的应用,就能加载Production配置了。
解决方案3:修改package.json脚本(不推荐,不够灵活)
如果你不想调整PM2的命令或配置,可以直接在package.json的start脚本里固定环境变量:
"scripts": { "start": "NODE_ENV=production node index.js" }
之后用pm2 start npm -- start启动即可。不过这种方式会把环境变量固定死,无法快速切换到Development环境,所以只适合单一环境的场景。
为什么之前的尝试失败?
pm2 start npm -- start NODE_ENV=production:这里的NODE_ENV=production是传给npm start的参数,不是环境变量,应用的process.env.NODE_ENV不会被设置。pm2 start npm -- start process.yml:你把配置文件当成了npm start的参数,PM2根本没读取这个文件,所以里面的环境变量设置完全没生效。
内容的提问来源于stack exchange,提问作者narad
相关产品推荐
相关产品推荐

