关闭高频低价值路径的access_log是最直接的吞吐提升手段,通过location块内配置access_log off可彻底跳过日志格式化、缓冲分配和write调用,使CPU与IO开销归零。

直接关掉不必要路径的日志写入,比把日志导到内存管道更有效、更轻量。真正影响吞吐率的不是日志内容本身,而是频繁的小块 write 系统调用 + 磁盘刷盘开销。内存管道(比如 access_log /dev/shm/nginx.log)看似绕过磁盘,但依然触发完整日志格式化、缓冲管理、系统调用和上下文切换,收益有限,还可能引入 /dev/shm 满载或权限问题。
关键在精准拦截、源头不写,而不是“换地方写”。
关闭高频低价值 location 的 access_log 是最直接的吞吐提升手段
这类请求本身无业务语义、响应固定、缓存命中率极高,却占日志体积 60% 以上:
- 健康检查端点:
/healthz、/readyz、/ping、/api/health - 静态资源:
.js、.css、.png、.woff2、.ico、.webp、/favicon.ico、/robots.txt - 探针类请求:由 K8s liveness/readiness probe、Consul check、负载均衡器发出
Nginx 中只需在对应 location 块内加一行 access_log off;,即可彻底跳过日志格式化、buffer 分配、write 调用全流程。CPU 和 IO 开销归零。
推荐配置方式:分层匹配 + 精确控制
避免全局关闭或宽泛正则,兼顾性能与可维护性:
-
对固定路径用
=精确匹配(最快):location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } location = /healthz { access_log off; return 200 "OK"; } -
对静态后缀用大小写不敏感正则(覆盖全、易维护):
location ~* \.(js|css|png|jpg|gif|webp|svg|woff2?|ttf|eot|ico)$ { access_log off; log_not_found off; expires 1y; add_header Cache-Control "public, immutable"; } -
对统一前缀路径用
^~前缀匹配(比正则更快):location ^~ /static/ { access_log off; log_not_found off; }
不建议用内存管道替代日志关闭
access_log /dev/shm/access.log; 存在明显缺陷:
- 仍执行
$remote_addr、$request等变量展开,消耗 CPU - 缓冲区管理、文件描述符占用、inode 更新照常发生
-
/dev/shm容量有限,默认通常仅 64MB,高峰易满导致写失败或 fallback 到磁盘 - 无法规避
log_not_found触发的 error.log 写入(大量 404 时尤为明显)
真正省资源的方式是:让这些请求根本不出现在日志流程里。
配套优化不可忽略
单关 access_log 只解决一半问题:
- 加
log_not_found off;防止静态服务缺失文件时狂刷 error.log - 对健康检查类 location 使用
return 200而非proxy_pass,减少 upstream 开销 - 若需保留部分日志用于审计,可用
map+log_if实现条件记录,而非全量写再过滤
验证是否生效,最直接的方法是:
strace -p $(pidof nginx) -e write -s 64 2>&1 | grep -E "(access|log)" | head -n 5
reload 配置后观察几秒,若无输出,说明目标请求已完全跳过日志链路。
不复杂但容易忽略。


















