Nginx 经典问题
Redis 的问题核心是“缓存一致性与失效”
Nginx 的问题核心是“流量、连接、代理与边界失控”
- 大量 502 / 504
- error.log 出现:
worker_connections are not enough
too many open files
- 新请求无法建立连接
- worker_connections 太小
- ulimit -n 太小
- 后端连接未复用(keepalive 未开)
- TIME_WAIT 堆积
- 大量慢连接(慢 POST、慢客户端)
连接资源被瞬间耗尽,整个入口失效
👉 缓存雪崩
- worker_connections + ulimit 调大
- upstream keepalive
- aggressive timeout
- 限流
- 防慢连接
- Nginx 正常
- 后端 CPU 100%
- 接口响应越来越慢
- 逐渐 504
- Nginx 没有缓存
- 热点接口被瞬间放大
- proxy_buffering 关闭
- 无重试 / 熔断
所有请求同时打到后端单点
👉 缓存击穿
- proxy_cache
- limit_req
- proxy_next_upstream
- 熔断 / 降级
- upstream least_conn
- 大量 404 / 400
- 后端 QPS 很高但无有效业务
- 日志暴涨
- 对不存在资源无限转发
- 未缓存 404
- 未做路径 / 方法限制
- 爬虫 / 扫描器
无效请求穿透到后端
👉 缓存穿透
- try_files
- proxy_cache 404
- deny 非法路径
- limit_req
- 白名单 API
下面这些是生产环境真正在出事的点。
- QPS 不高
- 连接数很高
- worker 占满
- CPU 不高但服务卡死
- client_body_timeout 太大
- proxy_read_timeout 太大
- 慢客户端持续占用连接
worker 被“慢 IO”拖死
- 短 connect timeout
- 限制上传速率
- 限制 body size
- limit_conn
- 404 / 302 循环
- Jenkins / GitLab 提示 proxy broken
- proxy_pass 带 / 不带 /
- location 与 prefix 不一致
- proxy_redirect 缺失
URI 重写规则理解错误
- 后端全是 127.0.0.1
- 风控失效
- 日志无法定位用户
- X-Forwarded-For 没配置
- real_ip 模块没开
- 盲信客户端 XFF
信任边界没划清
- HTTPS 比 HTTP 慢很多
- CPU 被 TLS 吃满
- TLS 握手多
- session cache 没开
- HTTP/2 未启用
- TLS session cache
- HTTP/2
- HSTS 稳定后再开
- 磁盘 IO 100%
- access.log 巨大
- 全量记录日志
- 高并发下同步写盘
日志成为性能瓶颈
- reload 后直接 502
- 某个 server block 抢占默认端口
- server_name 冲突
- default_server 误用
- upstream 名称冲突
- Nginx 做了太多业务逻辑
- Lua 过重
- 配置复杂难维护
把 Nginx 当应用服务器用
| Redis 问题 | Nginx 对应问题 | 本质 |
|---|---|---|
| 缓存穿透 | 无效请求穿透 | 边界缺失 |
| 缓存击穿 | 热点流量打爆后端 | 缺乏缓冲 |
| 缓存雪崩 | 连接 / FD 耗尽 | 资源枯竭 |
Redis 主要面临缓存一致性与失效问题,而 Nginx 作为流量入口,更容易出现连接耗尽、请求放大、后端被打爆等问题。
在生产中,我们通常通过限流、缓存、超时控制、负载均衡和连接复用来防止这些问题,本质是控制流量、隔离故障、保护后端。