Nginx日志优化核心是高效可控地降低I/O压力:用logrotate轮转压缩、精简日志内容(关闭静态资源记录/自定义格式)、启用buffer缓冲写入、必要时关闭非关键日志。

日志文件过大直接拖慢Nginx响应速度,核心问题不在“要不要记日志”,而在于“怎么记得更高效、更可控”。重点是减少磁盘I/O压力、避免单文件膨胀、剔除无效日志,而不是简单删或关。
用 logrotate 实现自动轮转与压缩
这是最稳妥、生产环境首选的方式。它不中断服务,还能按需保留、压缩、清理。
- 编辑配置:
/etc/logrotate.d/nginx,内容示例如下:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
- daily:每天切割一次;rotate 30:只保留最近30个归档;compress + delaycompress:压缩旧日志但不压刚切的那份,方便排查;
-
postrotate 中的
kill -USR1是关键——通知Nginx重新打开日志文件,确保新请求写入新文件。 - 测试配置是否正确:
logrotate -d /etc/logrotate.d/nginx(-d 表示调试模式);手动触发:logrotate -f /etc/logrotate.d/nginx。
精简日志内容,从源头减量
不是所有请求都值得记录。静态资源(图片、JS、CSS、HTML)访问量大但价值低,可直接关闭其日志。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- 在对应 server 或 location 块中添加:
access_log off; - 例如屏蔽常见静态文件:
location ~ \.(gif|jpg|jpeg|png|bmp|ico|css|js|woff|ttf|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
- 若只关注后端PHP请求,可统一在 PHP location 中开启日志,其余设为
off; - 自定义精简格式(去掉 referer、user_agent 等冗余字段):
log_format simple '$remote_addr [$time_local] "$request" $status $body_bytes_sent';
然后在 access_log 指令中引用:access_log /var/log/nginx/access.log simple;
启用缓冲写入,降低 I/O 频率
Nginx 支持内存缓冲日志,等积攒到一定大小或时间再刷盘,显著减轻磁盘压力。
- 修改 access_log 指令,加入
buffer和flush参数:
access_log /var/log/nginx/access.log main buffer=64k flush=10s;
-
buffer=64k:启用64KB内存缓冲区; -
flush=10s:最多等待10秒,即使没满也强制写入磁盘; - 同理可对
error_log启用缓冲(需 Nginx ≥1.9.0)。
必要时关闭非关键日志
开发调试期可开全量日志,上线后应严格评估日志必要性。
- 完全关闭访问日志:
access_log off;(适合反向代理层、健康检查路径); - 错误日志降级:
error_log /var/log/nginx/error.log warn;(避免 info/debug 级别刷屏); - 特定 location 关闭 SSL 握手日志(如已用 TLS 1.3):
ssl_protocols TLSv1.2 TLSv1.3;+ 配合error_log off;在该块内。


















