Nginx可配置为分层协同的“前端智能守门员”:连接层用limit_conn防耗尽,请求层用limit_req防洪水,转发层通过least_conn/ip_hash/weight等策略实现业务适配的负载均衡,响应层借助error_page、backup和proxy_cache主动降级兜底,同时需同步调优内核参数与Nginx底层设置。

把 Nginx 配置成“前端智能守门员”,既要分得准(负载均衡),又要拦得住(限流)、兜得稳(降级),三者不是堆在一起,而是分层协同:连接层控入口、请求层做筛查、转发层保后端、响应层兜底线。
一、负载均衡配置要匹配业务特征
别只写 upstream 就完事。不同场景选不同策略,直接影响抗压效果:
-
短连接洪峰(如秒杀、抢券):用
least_conn,新请求自动发给当前连接最少的后端,防某台机器被瞬间打满 -
长连接服务(如 WebSocket、实时推送):启用
ip_hash+ 主动健康检查,保证会话粘性,同时故障时能快速剔除异常节点 -
后端性能不均(新老机器混布):配合
weight显式分配流量,比如 8 核机器设weight=5,4 核设weight=2 -
关键链路隔离:用
map指令按请求路径或 header 区分流量,例如把/api/order和/api/search分到不同upstream,避免搜索抖动拖垮下单
二、限流必须落在连接与请求两个层面
单靠一种限流容易被绕过。Nginx 要在入口处设两道闸:
-
连接级限速(防连接耗尽):
limit_conn_zone $binary_remote_addr zone=conn_limit:10m,再在server块中加limit_conn conn_limit 15,限制单 IP 最多保持 15 个并发连接 -
请求级限速(防请求洪水):
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s,搭配limit_req zone=req_limit burst=60 nodelay,允许突发但超量直接返回 503,不排队阻塞 -
路径级精细拦截:对高危接口单独限流,比如
location /api/submit { limit_req zone=submit_limit burst=5; },防止提交类接口被刷爆
三、降级不是等出错才启动,而是主动设计兜底路径
真正有效的降级,是请求还没打到后端前就已准备就绪:
-
失败自动重试+切换:配置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504,并为 upstream 加backup节点,后端挂了自动切过去 -
静态降级页兜底:用
error_page 502 503 504 = @fallback,再定义location @fallback { root /usr/share/nginx/html; try_files /down.html =503; },返回预置 HTML 页面,不穿透后端 -
缓存兜底(读场景):对商品页、配置类接口开启
proxy_cache,即使后端全挂,只要缓存未过期,仍可返回旧数据,保障基本可用
四、内核与 Nginx 必须同步调优,否则配置再好也卡在底层
很多团队配了一堆限流却扛不住 SYN Flood,问题常出在系统层:
- 修改
/etc/sysctl.conf:设net.core.somaxconn = 65535、net.ipv4.tcp_max_syn_backlog = 65535、net.ipv4.tcp_syncookies = 1 - Nginx 的
listen必须显式带backlog=65535,例如listen 80 backlog=65535;,不能依赖默认值 - 调整 ulimit:全局设
ulimit -n 65535,并在nginx.conf中配worker_rlimit_nofile 65535 - 改完 sysctl 后,务必执行
systemctl reload nginx,否则新 backlog 不生效


















