关键在于Nginx协同配置:连接层设worker进程与文件描述符上限、启用epoll多收并行accept;请求层限流缓冲+长连接优化;分发层按场景选负载算法;缓存降级兜底。

处理高频突发流量,关键不是堆参数,而是让 Nginx 快速接、稳住队、不压垮、可缓冲。epoll 本身只是基础,真正起作用的是它背后的一整套协同配置。
连接层:先确保“接得住”
突发流量第一关是建连。如果连接进不来,后面全白搭:
- worker_processes auto; 让 Nginx 自动匹配 CPU 核心数,避免进程过少成为瓶颈
- worker_rlimit_nofile 1048576; 提前设好每个 worker 能打开的文件描述符上限,必须 ≥ worker_connections × worker_processes
- events { use epoll; worker_connections 65535; multi_accept on; accept_mutex off; } 显式启用 epoll,单次事件循环多收连接,多个 worker 并行 accept,减少争抢和空转
- 系统级同步调整:ulimit -n 和 net.core.somaxconn(建议 ≥ 65535)也得跟上,否则 Nginx 配再大也卡在系统层
请求层:防止“堵在中间”
连接建立后,大量请求涌入,若不加控制,会堆积在 Nginx 内存或后端队列中,引发延迟飙升甚至超时:
- limit_req_zone $binary_remote_addr zone=burst:10m rate=100r/s; 基于客户端 IP 限速,每秒最多 100 请求
- limit_req zone=burst burst=50 nodelay; 允许最多 50 个请求暂存(令牌桶溢出区),nodelay 表示不排队等待,直接按速率匀速放行,避免突发积压
- proxy_buffering on; 开启代理缓冲,配合 proxy_buffers 8 64k; 和 proxy_buffer_size 128k;,防止上游响应慢时阻塞 worker 连接
- keepalive_timeout 15s; keepalive_requests 100; 缩短长连接生命周期,加速连接回收,避免慢连接长期占位
分发层:让后端“扛得稳”
流量最终要落到后端服务,Nginx 的调度策略直接影响整体稳定性:
- 短连接洪峰(如秒杀)优先用 least_conn,把新请求导向当前连接最少的节点,防止单点打爆
- 长连接场景(如 WebSocket)用 ip_hash + 主动健康检查(health_check interval=3 fails=1 passes=1;),保障会话连续且自动剔除异常节点
- 后端能力不均时,搭配 weight 参数做加权轮询,例如新机器 weight=5,旧机器 weight=2
- 定义多个 upstream 块,再通过 map 指令结合请求头或 cookie 动态路由,实现运行时不 reload 切换算法
缓存与降级:减少穿透、兜住失败
真正扛住洪峰的,往往是离用户最近的那层缓冲:
- 静态资源启用 open_file_cache,降低磁盘 I/O 压力;API 接口对只读结果开启 proxy_cache,设置合理 inactive 和 max_size
- 用 error_page 502 503 504 = @fallback; 定义降级入口,当后端全部不可用时,返回预置 HTML 或 JSON,比如“活动火爆,请稍后再试”
- 非核心接口(如评论、分享)单独限流,避免拖垮下单、支付等主链路


















