return 444 是 nginx 特有的非标准状态码,作用是直接关闭 tcp 连接而不发送任何响应头或正文,不占用 request 内存、不触发日志与 upstream 处理,适用于非法 host、恶意 ua、危险路径等前置精准拦截。

使用 return 444 是 Nginx 中最轻量级的连接终止方式,它不发送任何响应头或正文,直接关闭 TCP 连接,从内核层面切断通信,避免触发 upstream、日志记录、变量计算等后续处理,从而彻底规避无效请求对内存和 CPU 的消耗。
理解 444 的本质作用
444 不是 HTTP 标准状态码,而是 Nginx 特有的“无响应关闭”指令。它在完成 TCP 握手后、尚未写入任何字节前就调用 shutdown() 或 close(),连接立即进入 FIN 状态。这意味着:
- 不占用 worker 进程的 request 结构体内存(约 16KB/请求)
- 不触发 access_log、rewrite、proxy_pass、limit_req 等阶段逻辑
- 不计入 $request_time、$upstream_response_time 等统计变量
- 客户端收到的是“连接被对方重置”,无 HTTP 响应解析开销
精准匹配并立即 return 444 的典型场景
应在最靠前的处理阶段拦截,推荐在 server 或 location 块中用 if 或 map 配合 return 444:
-
非法 Host 头或空 Host:防止泛域名扫描或 Host 注入攻击
if ($host !~ ^(example.com|www.example.com)$) { return 444; } -
非预期 User-Agent:如已知恶意爬虫 UA 或空 UA
if ($http_user_agent ~* (sqlmap|nikto|wget|curl|masscan)) { return 444; } -
无意义路径前缀:如 /.git/、/wp-admin/(非 WordPress 站点)
location ~ ^/(\.git|\.svn|wp-admin|phpmyadmin) { return 444; } -
未启用的 HTTP 方法:如 TRACE、TRACK、OPTIONS(非 CORS 预检)
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|PATCH)$) { return 444; }
避免常见误用导致失效
return 444 生效的前提是它必须是该请求生命周期中**唯一被执行的响应指令**:
- 不能与
proxy_pass、fastcgi_pass同处一个 location —— 一旦 upstream 指令存在,Nginx 会跳过 return 直接转发 - 不要在
if中嵌套其他指令(如 set、rewrite),否则可能绕过 return 执行 - 慎用多个
if判断叠加 —— Nginx if 是按顺序逐条判断,任一满足即执行 return,但逻辑复杂时易遗漏边界 - 不建议在
http块顶层直接 return 444 —— 会拦截所有请求,包括健康检查、静态资源等合法流量
验证是否真正生效
可通过 tcpdump 或 ss 观察连接行为,而非依赖 curl 输出(curl 可能显示 connection reset):
- 运行
sudo tcpdump -i any port 80 -nn -A,触发恶意请求,确认无 HTTP 响应数据发出 - 用
ss -tn state established '( dport = :80 )'查看 ESTABLISHED 连接数,对比正常请求与 444 请求的连接存活时间(444 应极短) - 检查 Nginx error log —— 正常情况下 444 不记 error 日志;若出现
client closed connection while waiting for request,说明连接已在读取请求前断开,符合预期











