更新ecosystem.config.js后Node应用仍用旧环境变量的排查求助
PM2环境变量未更新排查方案
问题背景
接手的服务器通过PM2+Nginx运行多个Node应用,新增应用时环境变量配置出错。修改ecosystem.config.js移除了NODE_EXTRA_CA_CERTS,并将NODE_TLS_REJECT_UNAUTHORIZED从0改为1,执行pm2 reload ecosystem.config.js --update-env和pm2 save后,应用仍在使用旧环境变量。已检查ecosystem.config.js和Nginx的sites-available目录配置,未发现问题。
环境变量排查步骤
1. 验证PM2是否加载新配置
- 执行
pm2 show new-app-name,查看输出中的env字段,确认是否与新配置一致。如果这里还是旧配置,说明PM2未正确读取配置文件,可能是执行命令时的目录不对,或者配置文件路径有误。 - 执行
pm2 describe new-app-name,查看environment variables部分,检查是否残留旧变量。
2. 清理PM2持久化缓存
PM2的持久化配置存储在PM2_HOME目录(此处为/home/pm2/.pm2),仅重载可能无法彻底更新,需重置应用配置:
- 停止应用:
pm2 stop new-app-name - 删除应用的PM2配置:
pm2 delete new-app-name - 重新从配置文件启动:
pm2 start ecosystem.config.js - 保存新配置:
pm2 save
3. 检查全局/用户级环境变量
当前环境变量中仍存在旧变量,可能是系统或用户全局配置中设置的:
- 查看PM2运行用户(
pm2用户)的配置文件:/home/pm2/.bashrc、/home/pm2/.bash_profile、/home/pm2/.profile,检查是否有export相关变量的语句。 - 查看系统级环境变量文件:
/etc/environment、/etc/profile、/etc/profile.d/*.sh,全局变量会被PM2继承。
4. 检查PM2系统服务配置
如果PM2是以系统服务运行(比如通过pm2 startup设置),服务启动时可能加载了额外环境变量:
- 查看PM2服务配置文件(如
/etc/systemd/system/pm2-pm2.service,路径随系统不同可能变化),检查Environment字段是否设置了相关变量。 - 若为systemd服务,修改配置后需重新加载:
systemctl daemon-reload,再重启PM2服务:systemctl restart pm2-pm2
5. 检查应用代码或本地配置文件
部分应用会自行读取本地配置文件或硬编码变量:
- 检查应用目录下的
.env、.env.production等文件,确认是否存在旧环境变量。 - 搜索应用代码,查看是否有直接设置
NODE_TLS_REJECT_UNAUTHORIZED或NODE_EXTRA_CA_CERTS的语句。
附:相关配置信息
旧ecosystem.config.js配置片段
{ name: "new-app-name", script: '/var/www/myNewApp.com/NEW-APP/app.js', watch_delay: 1000, exec_interpreter: "node@18.17.1", watch_delay: 1000, watch: true, env: { "PORT" : 4000, "NODE_ENV" : "production", "PROTOCOL" : "https", "DOMAIN" : "myDomain", "EXTENSION" : "com", "PWD" : "myPassword", "USE_LONGJOHN" : false, "NODE_TLS_REJECT_UNAUTHORIZED" : 0, "NODE_EXTRA_CA_CERTS": "/path/to/cert.pem" } }
新ecosystem.config.js配置片段
{ name: "new-app-name", script: '/var/www/myNewApp.com/NEW-APP/app.js', watch_delay: 1000, exec_interpreter: "node@18.17.1", watch_delay: 1000, watch: true, env: { "PORT" : 4000, "NODE_ENV" : "production", "PROTOCOL" : "https", "DOMAIN" : "myDomain", "EXTENSION" : "com", "PWD" : "myPassword", "USE_LONGJOHN" : false, "NODE_TLS_REJECT_UNAUTHORIZED" : 1, } }
重载后当前环境变量
node_version: 18.17.1 version: 1.0.0 unique_id: c96e0ae4-d2a7-49fd-8f41-d1eca6a5edff ldap: {} PM2_HOME: /home/pm2/.pm2 NODE_TLS_REJECT_UNAUTHORIZED: 0 NODE_EXTRA_CA_CERTS: /path/to/cert.pem USE_LONGJOHN: false EXTENSION: com DOMAIN: mydomain PROTOCOL: https NODE_ENV: production PORT: 4000 USER: pm2 SSH_CLIENT: 172.0.0.0 56122 22 XDG_SESSION_TYPE: tty SHLVL: 1 MOTD_SHOWN: pam HOME: /home/pm2 OLDPWD: /var/www/ldap.com/EDE-LDAP NVM_BIN: /home/admin/.nvm/versions/node/v14.18.2/bin SSH_TTY: /dev/pts/0 NVM_INC: /home/admin/.nvm/versions/node/v14.18.2/include/node DBUS_SESSION_BUS_ADDRESS: unix:path=/run/user/1000/bus NVM_DIR: /home/admin/.nvm LOGNAME: pm2 _: 7 XDG_SESSION_CLASS: user TERM: xterm-256color XDG_SESSION_ID: 15 PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin XDG_RUNTIME_DIR: /run/user/1000 LANG: en_US.UTF-8 SHELL: /bin/sh LESSCLOSE: /usr/bin/lesspipe %s %s PWD: myPassword SSH_CONNECTION: 172.0.0.0 56122 172.0.0.0 22 NVM_CD_FLAGS: XDG_DATA_DIRS: /usr/local/share:/usr/share:/var/lib/snapd/desktop PM2_USAGE: CLI PM2_JSON_PROCESSING: true NODE_APP_INSTANCE: 0 vizion_running: false km_link: false watch_delay: 1000 namespace: default script: /var/www/myNewApp.com/NEW-APP/app.js
内容的提问来源于Stack Exchange,提问作者Erin Tripp
相关产品推荐
相关产品推荐

