Ubuntu 16.04.3下/etc/environment变量重载失败求助
我之前在Ubuntu服务器上也碰到过一模一样的情况,折腾了好一会儿才搞明白问题所在,给你梳理下原因和解决办法:
先排查基础问题:/etc/environment的格式是否正确
你现在把两个变量写在同一行,虽然理论上允许,但Ubuntu的PAM会话加载时可能会出现解析问题。建议改成每行一个变量的格式,更稳妥:
# 编辑/etc/environment sudo nano /etc/environment
修改为:
MY_API_KEY="123123123" MY_API_SECRET="also123123"
保存退出后,重启服务器(sudo reboot),然后登录服务器执行echo $MY_API_KEY,确认变量能正常输出——如果这一步都读不到,那就是系统加载环境变量的问题,先解决这个基础问题。
核心问题:pm2的环境变量继承逻辑
pm2启动的应用,环境变量是继承自启动pm2时的会话的,而不同的pm2启动方式,会话环境完全不一样:
情况1:你是手动登录服务器后启动的pm2
重启服务器后,先登录到服务器,确认当前会话能读到环境变量(echo $MY_API_KEY有输出),然后再执行pm2 restart server。这样pm2会把当前会话的环境变量传递给你的Node应用,process.env就能读到了。
情况2:pm2是作为系统服务自动启动的(比如用pm2 startup配置过)
这种情况下,pm2的systemd服务默认不会读取/etc/environment里的用户环境变量,需要单独给pm2配置环境变量,推荐三种方法:
方法一:用pm2内置的env命令直接设置
直接给你的server应用绑定环境变量:
pm2 set server MY_API_KEY "123123123" pm2 set server MY_API_SECRET "also123123" pm2 restart server
设置后,pm2会把这些变量存在它的全局配置里,不管是手动重启还是系统自动启动,应用都能读到。你可以用pm2 show server查看应用详情,在Environment Variables部分确认变量是否存在。
方法二:修改pm2的systemd服务文件
找到pm2的systemd服务文件(一般路径是/etc/systemd/system/pm2-<你的用户名>.service),编辑它:
sudo nano /etc/systemd/system/pm2-<你的用户名>.service
在[Service]段落里添加Environment行:
[Service] # 其他原有配置... Environment="MY_API_KEY=123123123" Environment="MY_API_SECRET=also123123"
保存后,重新加载systemd配置并重启pm2服务:
sudo systemctl daemon-reload sudo systemctl restart pm2-<你的用户名>
方法三:使用pm2的生态系统配置文件(最推荐,便于管理)
创建一个ecosystem.config.js文件,把应用配置和环境变量都写进去:
module.exports = { apps : [{ name: 'server', script: './server.js', // 你的应用入口文件路径 env: { MY_API_KEY: "123123123", MY_API_SECRET: "also123123" } }] }
然后用这个配置启动/重启应用:
pm2 start ecosystem.config.js # 后续重启用 pm2 restart ecosystem.config.js
这种方法的好处是环境变量和应用配置绑定在一起,方便迁移和版本控制。
额外说明:Nginx不影响Node应用的环境变量
你的Nginx只是做反向代理,不会干预Node应用的环境变量读取,所以不用修改Nginx的配置,专注解决pm2的环境变量问题即可。
内容的提问来源于stack exchange,提问作者DarkArtistry




