最有效的方式是在 location 块中配置 access_log off;,配合精确匹配、前缀匹配或大小写不敏感正则匹配静态资源路径,并置于通用规则之前,同时启用 log_not_found off 和合理缓存头以彻底避免日志开销。

直接在 location 块里配 access_log off; 是最有效的方式,既不写磁盘、也不做日志格式化,从源头省掉全部开销。
用 location 精确或正则匹配静态路径
Nginx 的 location 匹配是内核级的,比 map 或 if 更快更可靠。推荐按实际路径特征分层处理:
-
对固定小文件(如图标、探测文件)用
=精确匹配,性能最优:location = /favicon.ico { access_log off; log_not_found off; }location = /robots.txt { access_log off; log_not_found off; }
-
对批量静态后缀,用大小写不敏感正则兜底:
location ~* \.(js|css|png|jpg|gif|webp|svg|woff2?|ttf|eot)$ { access_log off; log_not_found off; }
-
若静态资源统一放在
/static/或/assets/下,优先用前缀匹配(^~),避免正则解析:location ^~ /static/ { access_log off; log_not_found off; }
注意:这些 location 块要放在 location / 或 proxy_pass 规则之前,否则可能被更宽泛的规则覆盖。
配套减少干扰写入
关日志只是第一步,还要堵住其他隐性 I/O:
- 加
log_not_found off;:静态服务常因缺失.map或临时文件返回 404,关掉能避免 error.log 频繁刷盘 - 配缓存头(如
expires 1y; add_header Cache-Control "public, immutable";):降低回源频率,间接减少日志触发机会 - 不要用
access_log /dev/null;:它仍会走 write 系统调用,不如off彻底
验证是否生效
重载配置后,可用 strace 快速确认:
strace -p $(pidof nginx) -e write -s 64 2>&1 | grep access
持续几秒,无输出即表示对应请求已真正跳过日志写入。
不复杂但容易忽略。











