Apache不直接运行Node.js,需通过反向代理转发请求,日志管理须分两层:Apache代理日志用logrotate配置daily/size轮转并发送USR1信号;Node.js应用日志需PM2内置轮转或winston-daily-rotate-file等工具控制。

Apache 本身不直接运行 Node.js 应用,它通常作为反向代理(比如用 mod_proxy)把请求转发给后端的 Node.js 服务(如 PM2 启动的进程)。所以“Apache 中 Node.js 部署”的日志管理,实际要分两层处理:Apache 自身的代理日志(access/error),以及 Node.js 应用自身的日志。两者都可能撑爆磁盘,必须分别配置轮转。
Apache 层:用 logrotate 管理代理日志
这是最常见也最稳妥的方式,适用于所有 Linux 发行版:
- 确认 Apache 日志路径:Ubuntu/Debian 默认是
/var/log/apache2/*.log;CentOS/RHEL 是/var/log/httpd/*.log - 编辑或新建配置文件:
sudo nano /etc/logrotate.d/apache2(Debian)或/etc/logrotate.d/httpd(RHEL) - 填入以下最小可用配置(已适配生产环境):
/var/log/apache2/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
sharedscripts
postrotate
if [ -f /var/run/apache2.pid ]; then
kill -USR1 $(cat /var/run/apache2.pid)
fi
endscript
}
关键点说明:
USR1 信号让 Apache 优雅重开日志文件,不中断连接;
sharedscripts + postrotate确保所有匹配日志轮转完成后只发一次信号;
create 640 root adm保证新日志权限正确(Apache 进程通常属 adm 组)。
Node.js 层:不依赖 Apache,自己管好应用日志
Node.js 应用日志(如 console.log 输出、PM2 日志、或 winston/morgan 写入的文件)不在 Apache 控制范围内,必须单独处理:
-
推荐用 PM2 管理时启用内置日志轮转:启动时加
--rotate参数,或在ecosystem.config.js中配置:
module.exports = {
apps: [{
name: 'my-node-app',
script: './app.js',
out_file: './logs/out.log',
error_file: './logs/error.log',
log_file: './logs/combined.log',
max_logs: 10,
log_date_format: 'YYYY-MM-DD',
rotate: true, // 自动按天轮转
}]
};
-
若不用 PM2,改用日志库控制:例如
winston配合winston-daily-rotate-file,设置maxFiles: '14d'或maxSize: '10m'; -
绝对避免:直接
console.log到 stdout 且不捕获——PM2 默认会存为~/.pm2/logs/xxx-out.log,但无轮转,容易膨胀。
大小优先于时间:防突发写入的关键
光靠 daily 不够——大促或攻击时,几小时就能打满 2GB。建议在 logrotate 配置中加入 size 触发:
- 把上面配置里的
daily换成size 100M,表示单个日志超 100MB 就立即切割; - 更精细可写
size +50M:指“比上次轮转后新增 50MB 就切”,适合高频小日志场景; -
size和daily可共存,满足任一即触发,双重保险。
验证和日常维护
别等磁盘红了才检查:
- 手动测试轮转是否生效:
sudo logrotate -f /etc/logrotate.d/apache2(观察/var/log/apache2/是否生成.1文件并压缩); - 查 Node.js 日志目录大小:
du -sh ./logs/或du -sh ~/.pm2/logs/; - 加个简单监控:每天早上用
df -h /var和ls -lh /var/log/apache2/快扫一眼。


















