最直接有效的方式是在 location 块中配置 access_log off;,从源头跳过日志格式化与写入;适用于 /healthz、静态资源后缀、/metrics 等高频低价值路径,需精确匹配并避免被上级配置覆盖。

最直接有效的方式,是在 location 块中明确配置 access_log off;,从源头跳过日志格式化与写入流程,而不是事后过滤或重定向到空设备。这能显著减少 write 系统调用、磁盘 I/O 和 worker 进程 CPU 开销,尤其在高并发静态请求或探针请求场景下效果立竿见影。
哪些路径适合关闭 access_log
重点关掉高频、低业务价值、强缓存或纯内部用途的请求路径:
-
/healthz、/ping、/readyz等健康检查接口(每秒多次,无审计价值) -
/favicon.ico、/robots.txt(几乎每次页面访问都触发,但内容固定) - 静态资源后缀:
.js、.css、.png、.jpg、.gif、.ico、.woff2、.svg、.webp等 - 统一前缀路径:
/static/、/assets/、/dist/、/cdn/ - 监控类路径:
/metrics、/debug/pprof等内部接口
正确配置 location + access_log off
必须将 access_log off; 写在具体的 location 块内,且确保它不被更宽泛的规则覆盖:
- 用
location = /healthz实现精确匹配(性能最优) - 用
location ~* \.(js|css|png|jpg|gif|ico|woff2?|svg|webp)$实现大小写不敏感正则匹配 - 该
location块需放在location /或proxy_pass规则之前,避免被继承 - 可同步配置缓存策略,进一步减轻后端压力,例如:
expires 1y;和add_header Cache-Control "public, immutable";
示例配置:
location = /healthz {
access_log off;
return 200 "OK";
}
location ~* \.(js|css|png|jpg|gif|ico|woff2?|svg|webp)$ {
access_log off;
expires 1y;
add_header Cache-Control "public, immutable";
}
务必避开的常见错误
看似简单,但几个细节极易导致“关了等于没关”:
- 只在
server或http块里写access_log off;—— 它会被子location中未显式关闭的配置覆盖 - 用
log_if $uri ~* \.js$—— 日志仍会执行格式化、分配内存,CPU 不省 - 用
access_log /dev/null;—— 仍打开文件句柄并尝试写入,系统调用照常发生 - 忽略
log_not_found off;—— 大量404(如缺失 favicon、旧资源)仍会刷 error.log,造成额外 I/O
验证是否真正生效
重载配置后(nginx -s reload),需确认日志写入确实停止:
- 发起目标请求:
curl -I https://yoursite.com/app.js或curl https://yoursite.com/healthz - 观察
tail -f /var/log/nginx/access.log是否无新增行 - 检查 Nginx worker 进程是否还持有日志句柄:
lsof -p $(pidof nginx) | grep access,应无输出 - 压测时对比
iostat -x 1中的%util和await指标是否下降











