Nginx作为最常用的反向代理和Web服务器,默认会对每一个请求记录一条访问日志。在低流量场景下这几乎没有任何感知,但当QPS达到数千甚至上万时,日志写入会成为不可忽视的开销:每条日志都要经过格式化、系统调用和磁盘写入,磁盘IO被打满后,整个服务的响应延迟都会随之上升,严重时甚至触发磁盘队列阻塞,导致请求超时。本文围绕如何通过日志层面的配置和运维策略,减轻Nginx所在源站的磁盘与CPU压力展开讨论。

一、理解Nginx日志写入机制与压力来源
Nginx的日志模块在每次请求结束时,会将格式化好的日志文本写入对应的日志文件。默认配置下,access_log没有启用缓冲,也就是说每一条日志都会触发一次write系统调用。假设单机QPS为5000,每个请求产生一条约300字节的访问日志,那么每秒就有5000次小数据量的随机写操作,这对机械硬盘是灾难性的,对SSD也会加速写放大和寿命消耗。
除了写入频率,日志格式本身也影响IO量。默认的combined格式包含完整的User-Agent、Referer等长字段,加上如果开启了多个access_log指令(例如同时写一份原始日志和一份分析日志),写入量会成倍增加。理解了压力来源,才能针对性地做优化。
二、开启buffer缓冲与批量落盘
最直接有效的手段是给access_log加上buffer参数。开启缓冲后,Nginx先将日志写入内存中的缓冲区,当缓冲区写满或达到指定时间后才一次性刷盘,把大量小写入合并为少量大写入,大幅减少系统调用次数。
# 缓冲区为32KB,最多每5秒或缓冲区满时刷盘 access_log /var/log/nginx/access.log main buffer=32k flush=5s;
buffer的值建议设置在32k到64k之间,太小起不到合并效果,太大则在进程异常退出时丢失更多日志。flush参数控制最长多久落盘一次,对大多数监控场景5秒是可以接受的延迟。此外,如果磁盘带宽确实紧张,还可以叠加gzip参数,在刷盘前对日志先压缩再写入,进一步减少落盘体积。
# 开启缓冲并压缩写入,显著减少落盘数据量 access_log /var/log/nginx/access.log main buffer=64k flush=10s gzip=5;
对于确实不需要记录的请求,可以显式关闭日志。例如健康检查接口每秒被负载均衡探测几十次,这些日志毫无分析价值,白白消耗磁盘IO:
location /health_check {
access_log off;
return 200 "ok";
}
三、日志采样、拆分与轮转策略
当流量大到即使开了缓冲日志仍然过量时,可以考虑采样记录。Nginx本身没有内置采样指令,但可以借助map与if参数组合实现条件记录,例如只记录异常状态码的请求,正常请求完全不落盘。
map $status $loggable {
~^[23] 0;
default 1;
}
server {
access_log /var/log/nginx/access.log main buffer=32k flush=5s if=$loggable;
}
上面的配置只记录4xx、5xx等异常请求,日志量通常可以下降90%以上,同时保留了排障所需的关键信息。这种方式特别适合高并发的静态资源服务、CDN回源节点等场景,正常流量靠上游的全量统计即可覆盖。
日志轮转同样重要。单文件过大不仅分析工具打开变慢,还会让轮转时的rename操作耗时更久。建议使用logrotate按天或按大小切割,并配合compress减少磁盘占用。轮转后必须给Nginx主进程发送USR1信号让它重新打开日志文件句柄,否则worker进程会继续写入已被改名的旧文件,导致磁盘空间无法释放:
/var/log/nginx/*.log {
daily
rotate 14
compress
missingok
notifempty
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
最后还可以从架构层面彻底缓解压力:通过syslog将日志直接发送到远端采集系统,或用Filebeat把日志转发到ELK集群,源站本地只保留少量近期日志用于应急排查,历史数据全部归档到集中式存储。这样本地磁盘的日志写入压力几乎可以忽略,也避免了单机磁盘故障导致日志丢失。
四、验证优化效果
配置修改后,建议用iostat -x 1观察磁盘的util和await指标,对比优化前后的差异。正常情况下,开启buffer后每秒写次数会明显下降,单次写入的数据量变大,磁盘util会显著降低。同时可以用strace跟踪worker进程的write系统调用频率,直观确认合并写入是否生效。
如果日志量仍然偏高,再逐步叠加条件采样和远端采集方案,形成多层防护。日志优化是一项投入小、收益稳定的工作,做好之后能确保在流量高峰期,日志永远不会成为压垮源站的那块短板。
Nginx日志优化access_log缓冲磁盘IO压力修改时间:2026-09-01 22:41:29