大量404请求本身不直接耗CPU,但低效处理过程(如频繁stat、冗余日志、重写规则、未缓存“文件不存在”)会显著抬升CPU;应通过精确location匹配、关闭无关日志、启用open_file_cache errors、禁用冗余模块等优化响应路径。

大量 404 请求本身不会直接导致高 CPU,但若 Nginx 频繁执行路径查找、磁盘 stat、日志写入或触发后端逻辑(如重写规则、Lua 脚本、动态 fallback),就会显著抬升 CPU 使用率。关键不是“返回 404”耗 CPU,而是“如何返回 404”这个过程是否低效。
关闭冗余日志记录
默认 access_log 会对每个请求(包括 404)写入磁盘,高频 404 下 I/O 等待和格式化开销会反向拉高 CPU。应分级控制:
- 对已知无效路径(如 /favicon.ico、/robots.txt、/wp-admin、扫描器路径)用 location 块单独匹配并关闭日志:
location ~* ^/(favicon\.ico|robots\.txt|\.php|\/wp-|\/admin\/) {<br> access_log off;<br> return 404;<br>} - 全局禁用非必要字段,例如去掉
$request_time或$upstream_response_time(它们在 404 时无意义且需计算) - 错误日志级别设为 warn 或更高,避免 info/debug 级别刷屏
避免文件系统遍历与 stat 调用
Nginx 在找不到文件时默认会逐级检查磁盘(尤其是启用了 try_files 或 index 指令时),每次 404 都可能触发多次 stat() 系统调用——这在高并发下是隐性 CPU 杀手。
- 静态资源服务中,若明确知道资源只在特定目录下,禁用
try_files $uri @fallback类兜底逻辑,改用精确匹配 - 移除不必要的
index index.html,除非真有目录索引需求;否则它会让 Nginx 对每个请求都尝试查找 index 文件 - 启用
open_file_cache并合理配置,让 Nginx 缓存 “文件不存在” 的结果(即 negative cache):open_file_cache max=10000 inactive=60s;<br>open_file_cache_valid 30s;<br>open_file_cache_min_uses 1;<br>open_file_cache_errors on;
其中 open_file_cache_errors on 是关键,它使 “文件不存在” 也被缓存,大幅减少重复 stat
快速响应,绕过重写与模块链路
很多 404 实际源于重写规则未命中、正则匹配失败或第三方模块(如 ModSecurity、Lua)介入判断,这些都会增加 CPU 指令路径。
- 将高频 404 路径(如旧 URL、爬虫探测路径)放在 server 块最顶部,用
location = /xxx或location ^~ /api/v1/old/精确/前缀匹配,直接return 404,跳过后续所有处理 - 禁用无关模块:若不使用 Lua,编译时加
--without-http-lua-module;若不用 GeoIP,避免加载对应模块 - 检查
rewrite规则是否形成循环或过度回溯,可用nginx -t -v查看 debug 日志中 rewrite 执行次数
补充:监控与验证手段
优化是否生效,不能只看 CPU,要看底层行为是否收敛:
- 用
perf top -p $(pgrep nginx)看是否还有高频sys_open、do_syscall_64或正则函数(如pcre_exec) - 开启
error_log /var/log/nginx/error.log debug;(临时),观察 404 请求是否还触发open() "/path" failed (2: No such file)大量重复输出 - 用
ss -s和pidstat -w 1对比优化前后上下文切换次数,下降明显说明内核路径更短


















