Nginx错误日志按行为归为四类:1.上游连接失败(111: Connection refused);2.上游建连超时(110: Connection timed out);3.上游响应超时(reading response timeout);4.上游提前断连(104: Connection reset by peer)。

Nginx 错误日志本身不直接分类“超时类型”,但可通过错误信息中的关键词、errno 编码、上下文动词(如 connecting、reading、writing)和关联字段,把连接异常归为几类典型问题。统计时需结合 grep、awk 等命令提取模式,而非依赖状态码。
按错误行为归类:四类核心异常
-
上游连接失败(Connect Refused)
关键词:connect() failed (111: Connection refused)
含义:Nginx 尝试建立 TCP 连接时被拒绝,说明后端进程未监听、端口错、防火墙拦截或服务崩溃。
统计命令:grep "connect() failed.*111" /var/log/nginx/error.log | wc -l
-
上游建连超时(Connection Timeout)
关键词:upstream timed out.*while connecting to upstream或(110: Connection timed out)
含义:SYN 发出后未收到 ACK,常见于后端启动中、连接池耗尽、网络中间设备丢包或 SYN Flood 防护触发。
注意区分:若同时出现while connecting,属建连阶段;若为while reading response header,则属响应阶段。
统计命令:grep "upstream timed out.*connecting" /var/log/nginx/error.log | wc -l
-
上游响应超时(Read Timeout)
关键词:upstream timed out.*while reading response header或while reading upstream
含义:Nginx 已发请求给后端,但长时间未收到响应头或体,大概率是应用卡在数据库、锁、死循环或慢查询。
可交叉验证 access.log 中$upstream_response_time是否接近proxy_read_timeout值。
统计命令:grep "upstream timed out.*reading" /var/log/nginx/error.log | wc -l
-
上游提前断连(Premature Close / Reset)
关键词:upstream prematurely closed connection或Connection reset by peer (104)
含义:后端在响应过程中主动关闭连接,常见于 PHP 内存溢出被 kill、Python 进程崩溃、Java 应用 OOM、或未正确输出 HTTP 头就退出。
统计命令:grep -E "(prematurely closed|reset by peer.*104)" /var/log/nginx/error.log | wc -l
辅助归类:补充高频异常项
-
Broken pipe:发生在 Nginx 向客户端写响应时对方已断开,多见于移动端弱网、前端取消请求、或 CDN 层超时中断。需过滤掉非响应阶段的干扰项(如启动期报错)。 -
No route to host (113):路由不可达,常出现在容器跨网段、VPC 配置错误或 DNS 解析返回无效 IP 后。 -
Cannot assign requested address (99):本地端口耗尽,检查net.ipv4.ip_local_port_range和net.ipv4.tcp_tw_reuse设置。
统计建议:用时间窗口+分组聚合更实用
不建议只跑全量 wc -l,而应按小时切片并汇总,例如:
# 统计最近24小时内四类错误各出现多少次
awk -v d=$(date -d '24 hours ago' '+%Y/%m/%d %H') '$1" "$2 >= d {print}' /var/log/nginx/error.log | \
awk '
/connect\(\) failed.*111/ {c1++}
/upstream timed out.*connecting/ {c2++}
/upstream timed out.*reading/ {c3++}
/prematurely closed|reset by peer.*104/ {c4++}
END {print "Refused:",c1,"ConnTimeout:",c2,"ReadTimeout:",c3,"Reset:",c4}
'这类归类不依赖应用层协议,适用于 HTTP、TCP stream、FastCGI 所有代理场景。关键是抓住 errno 和动作动词,而不是看有没有“timeout”字眼。


















