You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 16.04.3下/etc/environment变量重载失败求助

解决Ubuntu 16.04中/etc/environment添加变量后pm2应用无法读取的问题

我之前在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

火山引擎 最新活动