如何在EC2 Linux实例上为PM2管理的Node.js应用设置环境变量
解决EC2 Linux上PM2无法读取环境变量的问题
我之前在EC2上部署Node.js应用时也碰到过一模一样的坑——系统级配置的环境变量死活不被PM2加载,导致应用崩溃提示缺少必要变量。这主要是因为PM2启动的进程默认不会加载bash的配置文件(比如/etc/profile、~/.bashrc这些),尤其是当PM2作为服务启动时,它的运行环境和你登录shell的环境完全不同。下面给你几个靠谱的解决方案:
方案1:直接通过PM2传递环境变量(最快捷)
临时启动时传递
如果只是临时测试,可以在启动命令里直接指定环境变量:
pm2 start your-app.js --env USERNAME=your-actual-username
用PM2配置文件持久化(推荐)
创建一个ecosystem.config.js文件,把环境变量写在配置里,这样每次启动都会自动加载:
module.exports = { apps: [{ name: "your-app-name", script: "./app.js", env: { NODE_ENV: "production", USERNAME: "your-actual-username" // 这里填你的用户名 } }] };
然后用这个配置文件启动应用:
pm2 start ecosystem.config.js
方案2:让PM2加载系统级环境变量
如果你的环境变量需要和系统其他进程共享,可以通过修改PM2的systemd服务配置来实现:
- 先导出PM2的systemd配置(如果还没做过):
pm2 startup systemd -u ec2-user --hp /home/ec2-user
- 编辑生成的systemd服务文件(路径通常是
/etc/systemd/system/pm2-ec2-user.service):
在[Service]段落下添加环境变量:
[Service] Environment="USERNAME=your-actual-username"
- 重新加载systemd配置并重启PM2服务:
sudo systemctl daemon-reload sudo systemctl restart pm2-ec2-user
方案3:验证环境变量是否生效
不管用哪种方法,都可以用下面的命令检查PM2进程是否正确读取到了环境变量:
pm2 show your-app-name
在输出的Environment variables部分,你应该能看到USERNAME和对应的值。如果没看到,说明配置没生效,回到前面的步骤检查。
另外提醒一下:Linux系统里默认的用户名环境变量是USER,但你开发环境用的是USERNAME,所以一定要保持变量名完全一致,别写错大小写!
内容的提问来源于stack exchange,提问作者Victor O'Frank




