Nginx 反向代理排障:502、超时和连接耗尽怎么定位
一、先把链路拆开看
Nginx 常见角色是入口代理、静态资源服务器和负载均衡器。故障发生时,前端看到的通常只是 502、504 或连接超时,但真实原因可能在 Nginx、上游应用、网络、DNS 或连接池。排障第一步是拆链路:客户端到 Nginx 是否通,Nginx 到 upstream 是否通。
状态码含义要分清。502 多数表示上游异常响应或连接失败;504 表示等上游响应超时;499 表示客户端主动断开,常见于移动网络、浏览器取消请求或客户端超时小于服务端处理时间。
| 现象 | 常见原因 | 首选排查点 |
|---|---|---|
| 502 | upstream 拒绝连接、进程崩溃 | error.log |
| 504 | 上游慢、代理超时太短 | upstream 响应时间 |
| 499 | 客户端断开 | 请求耗时 |
| 偶发慢 | 连接池耗尽、DNS 抖动 | 指标和系统资源 |
二、日志格式要能看出上游耗时
默认 access log 信息不够。生产环境建议加上 upstream 地址、上游状态码、请求总耗时、上游响应耗时。
log_format main_ext '$remote_addr "$request" ' 'status=$status bytes=$body_bytes_sent ' 'rt=$request_time urt=$upstream_response_time ' 'ua="$upstream_addr" us="$upstream_status" ' 'agent="$http_user_agent"'; access_log /var/log/nginx/access.log main_ext; error_log /var/log/nginx/error.log warn;配置完成后用nginx -t检查,再 reload。不要直接 restart,除非可以接受中断。排查时可用awk筛出慢请求。
nginx-tnginx-sreloadawk'$0 ~ /rt=/ {print}'/var/log/nginx/access.log|tail-20tail-100/var/log/nginx/error.log如果request_time和upstream_response_time都高,瓶颈多半在上游应用;如果 upstream 时间为空,可能是请求没有到达 upstream。
三、代理超时和连接复用要成套配置
很多 504 是上游确实慢,也有一部分是 Nginx 超时配置和业务接口不匹配。更好的做法是把慢接口异步化,普通 API 维持短超时。
upstream api_backend { server 10.0.1.11:8080 max_fails=3 fail_timeout=10s; server 10.0.1.12:8080 max_fails=3 fail_timeout=10s; keepalive 128; } server { listen 80; server_name api.example.com; location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_connect_timeout 3s; proxy_send_timeout 30s; proxy_read_timeout 30s; proxy_pass http://api_backend; } }keepalive能减少到上游的连接建立成本,但上游应用也要能承受长连接和并发连接数。Nginx 这边调大不代表后端就能扛住。
ulimit-nss-sss-antp|grep':8080'|headcat/proc/sys/net/core/somaxconn四、静态资源和压缩别混在业务故障里
Nginx 常同时代理 API 和静态资源。静态文件路径、缓存头、gzip 配置不当,也会让页面变慢,但它和 502 不是一类问题。建议把静态资源和 API 的 location 分开。
location /assets/ { root /var/www/app; expires 30d; add_header Cache-Control "public, max-age=2592000, immutable"; try_files $uri =404; } location /api/ { proxy_pass http://api_backend; }实践建议:先把 access log 扩展到能看到 upstream,再建立固定排障顺序:查状态码分布、看 error.log、确认 upstream 健康、检查连接,最后再改超时或负载均衡策略。入口配置小步修改、先nginx -t、再 reload。
如果你正在学习云原生或搭建个人项目,推荐试试腾讯云轻量应用服务器,新用户专享优惠,一键部署开发环境非常方便:点击查看优惠
