插件窝 干货文章 Linux Node.js日志权限设置要点

Linux Node.js日志权限设置要点

nodeapp 权限 Node 日志 746    来源:    2025-05-04

Linux 下 Node.js 日志权限设置要点

基本权限设置原则

  1. 最小权限原则:日志文件/目录只授予必要的权限
  2. 用户隔离:Node.js 应用应该使用专用用户运行
  3. 目录结构:建议将日志存放在 /var/log/[appname]/ 目录下

具体设置步骤

1. 创建专用用户和组

sudo groupadd nodeapp
sudo useradd -g nodeapp nodeapp -s /bin/false

2. 创建日志目录并设置权限

sudo mkdir -p /var/log/my-node-app
sudo chown nodeapp:nodeapp /var/log/my-node-app
sudo chmod 750 /var/log/my-node-app

3. 日志文件权限设置

在 Node.js 应用中,确保日志文件创建时使用正确的权限:

const fs = require('fs');
const logStream = fs.createWriteStream('/var/log/my-node-app/app.log', {
  flags: 'a', // 追加模式
  mode: 0o640 // 设置权限为 -rw-r-----
});

4. 使用 logrotate 管理日志

创建 /etc/logrotate.d/my-node-app 文件:

/var/log/my-node-app/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 nodeapp nodeapp
    sharedscripts
    postrotate
        [ ! -f /var/run/my-node-app.pid ] || kill -USR1 `cat /var/run/my-node-app.pid`
    endscript
}

5. 使用 PM2 时的权限设置

如果使用 PM2 管理 Node.js 应用:

pm2 start app.js --uid nodeapp --gid nodeapp

并确保 PM2 日志目录权限正确:

sudo chown -R nodeapp:nodeapp /home/nodeapp/.pm2

常见问题解决方案

1. "EACCES: permission denied" 错误

解决方法:

sudo setfacl -R -m u:nodeapp:rwx /var/log/my-node-app

2. 日志文件不轮转

检查: - logrotate 配置是否正确 - 确保 postrotate 脚本能正确通知应用重新打开日志文件

3. SELinux 相关问题

如果启用了 SELinux,可能需要调整上下文:

sudo semanage fcontext -a -t httpd_log_t "/var/log/my-node-app(/.*)?"
sudo restorecon -Rv /var/log/my-node-app

最佳实践

  1. 避免使用 root 用户运行 Node.js 应用
  2. 定期审查日志文件权限
  3. 考虑使用专门的日志库如 Winston 或 Bunyan,它们提供更细粒度的日志控制
  4. 对于敏感日志,设置更严格的权限 (600)

通过以上设置,可以确保 Node.js 应用日志既安全又可维护。