nginx 无内置自动过载保护开关,但可通过限流、连接控制、健康探测与外部信号联动实现近似熔断的自动降级:按uri或ip限速限连,上游异常时自动摘除,超阈值时切换维护页。

Nginx 本身不提供“自动触发过载保护”的开箱即用开关,但可通过组合限流、健康探测、状态标记与动态响应机制,在系统遭遇超大流量时实现接近熔断的自动降级效果。关键不是等崩溃再反应,而是提前识别压力信号并主动收缩。
基于请求速率的实时限流+突发缓冲
这是第一道防线,控制入口节奏,防止后端被瞬间冲垮:
- 按接口粒度定义限流区,例如下单路径严格控速:
limit_req_zone $uri zone=order:10m rate=2r/s; - 允许短时突增但拒绝排队:
location /api/v1/order { limit_req zone=order burst=2 nodelay; } - 对登录类接口防爆破:
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;配合burst=1,超即返回 429
基于连接数的硬性资源守门
限流管的是请求频率,而连接耗尽往往更早发生。限制并发连接可直接阻断 Slowloris 类攻击和连接堆积:
- 定义连接统计区:
limit_conn_zone $binary_remote_addr zone=conn_perip:10m; - 在 server 或 location 中启用:
limit_conn conn_perip 50;(单 IP 最多 50 个并发连接) - 若需限制发往某台后端的连接总数,可用:
limit_conn_zone $upstream_addr zone=upstream_conn:10m;
再在 proxy_pass 前加limit_conn upstream_conn 200;
基于后端状态的自动避障与摘除
当某台上游已响应迟缓或频繁报错,Nginx 应快速感知并绕行,避免雪崩传导:
- 在 upstream 中为每个节点配置激进剔除策略:
server 192.168.1.10:8080 max_fails=2 fail_timeout=15s; - 增强代理层容错:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;proxy_next_upstream_tries 2; - 如需周期性主动探活(非默认支持),可编译
nginx_upstream_check_module,配置每 3 秒 GET /health,连续 2 次失败即标记 down
基于外部信号的维护模式自动切换
当整体流量持续超阈值(如每分钟请求超 5000),可由脚本生成标记文件,Nginx 读取后全局返回静态维护页:
- 写一个每分钟运行的检查脚本(如
/usr/local/bin/check-overload.sh),分析 access.log 近 60 秒请求数,超阈值则touch /var/run/nginx-maint-mode - Nginx 中用 map 映射该文件是否存在:
map $request_uri $maintenance_mode { default 0; include /etc/nginx/maintenance.map; }
并在 http 块中定义:map $sent_http_content_type $redirect_to_maint { ~^text/html$ 1; } - 在 server 块中判断:
if (-f /var/run/nginx-maint-mode) { return 503; }
并配合error_page 503 /503.html;和add_header Retry-After 60;











