在Linux系统下为Node.js应用程序设置日志权限是非常重要的,以确保应用程序正常运行并防止未经授权的访问。以下是一些建议的步骤和注意事项:
/var/log/[appname]/ 目录下。创建专用用户和组
sudo groupadd nodeapp
sudo useradd -g nodeapp nodeapp -s /bin/false
创建日志目录并设置权限
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
日志文件权限设置
在Node.js应用中,确保日志文件创建时使用正确的权限:
const fs = require('fs');
const logStream = fs.createWriteStream('/var/log/my-node-app/app.log', {
flags: 'a', // 追加模式
mode: 0o640 // 设置权限为 -rw-r-----
});
使用 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
}
使用 PM2 时的权限设置
如果使用 PM2 管理 Node.js 应用:
pm2 start app.js --uid nodeapp --gid nodeapp
并确保 PM2 日志目录权限正确:
sudo chown -R nodeapp:nodeapp /home/nodeapp/.pm2
“EACCES: permission denied” 错误
解决方法:
sudo setfacl -R -m u:nodeapp:rwx /var/log/my-node-app
日志文件不轮转
检查:
logrotate 配置是否正确postrotate 脚本能正确通知应用重新打开日志文件SELinux 相关问题
如果启用了 SELinux,可能需要调整上下文:
sudo semanage fcontext -a -t httpd_log_t "/var/log/my-node-app(/.*)?"
sudo restorecon -Rv /var/log/my-node-app
通过以上设置,可以确保 Node.js 应用日志既安全又可维护。