最小權限原則:僅授予Node.js應用運行所需的最低權限,避免過度開放(如禁止使用777
權限);用戶隔離:使用專用用戶(如nodeapp
)運行應用,避免以root
身份運行;目錄結構規范:建議將日志存放在/var/log/[appname]/
目錄下,便于集中管理。
# 創建用戶組
sudo groupadd nodeapp
# 創建專用用戶(無登錄權限,shell設為/bin/false)
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應用中,通過fs.createWriteStream
明確指定日志文件的權限(0o640
表示所有者可讀寫,組可讀,其他用戶無權限):
const fs = require('fs');
const logStream = fs.createWriteStream('/var/log/my-node-app/app.log', {
flags: 'a', // 追加模式
mode: 0o640 // 關鍵權限設置
});
若用PM2管理應用,啟動時需指定專用用戶/組,并修復PM2自身目錄權限:
# 啟動應用時綁定用戶/組
pm2 start app.js --uid nodeapp --gid nodeapp
# 設置PM2日志目錄權限(確保PM2能寫入)
sudo chown -R nodeapp:nodeapp /home/nodeapp/.pm2
使用logrotate
工具自動分割、壓縮舊日志,配置文件存放在/etc/logrotate.d/
下(以my-node-app
為例):
# 創建logrotate配置文件
sudo vim /etc/logrotate.d/my-node-app
配置內容如下(每日輪轉、保留14天、壓縮舊日志、通知應用重新打開文件):
/var/log/my-node-app/*.log {
daily # 每日輪轉
missingok # 忽略缺失文件
rotate 14 # 保留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
}
若應用無法寫入日志目錄,可使用setfacl
添加ACL權限(無需修改原有權限結構):
sudo setfacl -R -m u:nodeapp:rwx /var/log/my-node-app # 授予用戶讀寫執行權限
若系統啟用SELinux,需調整日志目錄的上下文(以httpd_log_t
為例):
# 添加SELinux上下文規則
sudo semanage fcontext -a -t httpd_log_t "/var/log/my-node-app(/.*)?"
# 應用上下文到現有目錄
sudo restorecon -Rv /var/log/my-node-app
600
);winston
(支持多傳輸、格式化)、pino
(高性能)或bunyan
(結構化JSON),提升日志管理能力;auditd
等工具監控日志文件的訪問與修改,及時發現異常操作。