module.exports = { apps: [{ name: 'api',
  script: 'dist/index.js',
  env: { NODE_ENV: 'production', PORT: '3000' } }] };

在命令行里直接启动能读到环境文件里的配置,交给进程管理工具之后就报缺少数据库地址,手动重启一次还是同样的提示。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:进程管理工具有自己的一套环境,终端里导出的变量不会自动带进去,而且它把第一次启动时的环境缓存了下来,改完不重新加载就不生效。

「pm2 环境变量丢失」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

处理上按这个顺序:把变量写进启动配置文件的 env 字段当中去;改完之后用重新加载的方式让这份配置真正生效;敏感值单独放到环境文件 不要提交到仓库里。

确认没问题再收工,在进程环境里能看到变量,业务正常连上数据库,不再报缺配置。

作者 9823189