nginx限流核心是保障合法请求优先通行、恶意请求快速失败,通过limit_req_zone与limit_req构建漏桶防线,结合limit_conn防连接耗尽,并辅以ua/路径等特征过滤,实现分层非阻塞拦截。

核心思路不是“挡住所有恶意流量”,而是让合法请求优先通行、恶意请求快速失败不拖累系统。Nginx 本身不识别“恶意”,但可通过行为特征(如高频、单IP多连接、异常UA)做有效压制,关键在分层拦截+非阻塞配合。
按请求速率精准限流
用 limit_req_zone + limit_req 构建漏桶防线:
- 对登录、短信发送等高风险接口,设严苛速率:rate=5r/m(每分钟5次),burst=10,加 nodelay——超限立即返回503,不排队不等待
- 对普通API,设合理缓冲:rate=10r/s,burst=30,不加 nodelay——允许短时突发,平滑流量毛刺
- 区分资源类型限流:比如把
$binary_remote_addr$uri当作键,避免同一IP刷不同接口绕过限制
控制并发连接数防资源耗尽
单个IP建几百个空闲连接就能拖垮服务,limit_conn 是必要补充:
- 单IP连接数限制:用
limit_conn_zone $binary_remote_addr zone=perip:10m+limit_conn perip 20,防脚本暴力建连 - 全局限流保底:用
limit_conn_zone $server_name zone=allsrv:100m+limit_conn allsrv 1000,防止后端被连接池打满 - 注意:limit_conn 对 keepalive 长连接也生效,需结合
keepalive_timeout合理设置(如 60s)
基于特征主动过滤可疑请求
不依赖IP黑名单(易失效),而用请求头、路径等实时特征做轻量拦截:
- 屏蔽已知恶意 UA:
if ($http_user_agent ~* "BadBot|sqlmap|nmap") { return 403; } - 拦截高频扫描路径:
if ($request_uri ~* "/wp-admin/|/phpmyadmin/|/shell.php") { return 444; }(444 是 Nginx 特有关闭连接码,不发响应) - 限制无 Referer 或异常 Referer 的请求访问敏感接口,减少 CSRF 和爬虫直连
确保底层非阻塞链路不被拖垮
再好的限流配置,若后端卡住或内核丢包,照样雪崩:
- 调大系统参数:
net.core.somaxconn = 65535、net.ipv4.tcp_max_syn_backlog = 65535 - Nginx listen 加
backlog=65535,避免 TCP 握手队列溢出直接丢连接 - proxy_pass 后端配置
proxy_read_timeout 15、proxy_next_upstream error timeout http_500-504 tries=2,失败快速切换,不卡住 worker











