nginx服务降级是主动、分层、可开关的退守策略:入口层连接限流防资源耗尽,路径级请求限流按业务差异化控制,全局降级开关支持热更新,缓存兜底返回过期但可用内容。

面对大流量冲击,Nginx 的服务降级不是被动“扛不住就挂”,而是主动、分层、可开关的退守策略——核心是把决策前移到接入层,不依赖后端,毫秒级生效。
入口层连接限流:防资源耗尽的第一道闸门
连接打满比请求超载更致命。一旦文件描述符或内存被占光,连健康检查都发不出去:
- 用 limit_conn_zone 按客户端 IP(推荐
$binary_remote_addr)建共享内存区,例如zone=conn_per_ip:10m - 在 server 或 location 中设硬性连接上限,如
limit_conn conn_per_ip 50,防止单 IP 建大量空闲连接 - 配合系统调优:
net.core.somaxconn和net.ipv4.tcp_max_syn_backlog均设为 65535,并在listen指令显式加backlog=65535
路径级请求限流:按业务敏感度差异化控节奏
不同接口承载力差异大,不能一刀切。登录页可宽松,下单和支付回调必须严控:
- 用 limit_req_zone 定义多维度限流键:按
$uri控接口,按$http_x_user_level控用户等级,按$arg_appid控调用方 - 关键路径启用
nodelay,拒绝排队,宁可快速失败也不堆积延迟;非核心接口允许burst缓冲,平滑洪峰 - 示例:对
/api/v1/order设rate=2r/s burst=2 nodelay,避免库存超卖和数据库锁表
全局降级开关:配置驱动、热更新、统一拦截
不改代码、不重启,靠 Nginx 自身能力实现全站级降级:
- 在
http块用 map 定义动态变量$is_downgraded,支持从请求头(X-Global-Downgrade)、Cookie、URI 参数或 Lua 读 Redis 实时取值 - 在顶层
location /统一判断:API 返回轻量 JSON,HTML 重写至/downgrade.html,并白名单放行/login、/healthz、静态资源等关键路径 - 所有降级响应添加
X-Downgraded: true头,日志中记录$is_downgraded字段,便于监控与归因
缓存兜底机制:让“过期但可用”成为默认安全态
后端已不可用时,Nginx 不应返回错误,而应返回最近一次有效内容:
- 开启 proxy_cache_use_stale,对
error timeout http_500–504等状态仍发缓存 - 对 503 响应单独缓存短时间(如
proxy_cache_valid 503 10s),加速降级传播 - 配
proxy_cache_lock on,防止缓存失效瞬间大量回源;静态资源(JS/CSS/图片)跳过降级逻辑,直接由 Nginx 响应











