最直接有效的方式是在 location 块中显式配置 access_log off;,针对高频静态资源(如 .js、.css、/favicon.ico、/static/ 等)关闭日志,避免系统调用与 I/O 开销,需置于具体 location 内且位置靠前,禁用 log_if 或 /dev/null 等无效写法。
最直接有效的方式,是在 location 块中显式配置 access_log off;,从源头跳过日志格式化与写入流程,而不是事后过滤或重定向到空设备。这能显著减少 write 系统调用、磁盘 I/O 和 worker 进程 CPU 开销,尤其在高并发静态请求场景下效果明显。
重点关闭高频、低业务价值、强缓存的请求:
必须在具体 location 块内配置,且位置要靠前,避免被更宽泛的规则覆盖:
location ~* .(js|css|png|jpg|gif|ico|woff2?|ttf|eot|svg|webp)$
location / 或 proxy_pass 规则之前access_log off;,可同步加缓存头提升性能示例:
location ~* .(js|css|png|jpg|gif|ico|woff2?|ttf|eot|svg|webp)$ {access_log off;
expires 1y;
add_header Cache-Control "public, immutable";
}
看似简单,但几个细节常导致配置无效:
server 块写 access_log off; —— 子 location 会继承默认日志配置,除非显式关闭log_if $uri ~* .js$ —— 日志格式化仍执行,不省 CPU,仅跳过写入access_log /dev/null; —— 仍打开文件句柄并尝试写入,不如 off 彻底log_not_found off; —— 静态资源 404(如前端路由缺失)会持续刷日志reload 后需确认日志写入确实停止:
curl -I https://yoursite.com/app.js
tail -f /var/log/nginx/access.log 是否无新增行lsof -p $(pidof nginx) | grep access,应无输出