Nginx访问限制通过限流、限连、黑白名单等机制从源头防控无效请求。具体包括:limit_req按IP对敏感路径限频;limit_conn控制单IP并发连接数;deny/allow实现IP黑白名单;配合User-Agent过滤、keepalive优化及系统级调优提升抗压能力。

直接用 Nginx 的访问限制机制,能从源头压住无效、恶意或过载请求,比等请求抵达后端再处理更高效。核心是控制“谁来”“来多少”“怎么来”,而不是单纯调高硬件或加缓存。
按 IP 限流防刷和爆破
对登录页、API 接口这类敏感路径,用 limit_req 控制单位时间请求数:
- 在
http块定义限流区:limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;(每分钟最多 5 次,10MB 内存约存 16 万个 IP) - 在对应
location中启用:limit_req zone=login burst=8 nodelay;(允许瞬时多 8 次,超了立刻返回 503) - 避免误伤正常用户:可配合
$http_x_forwarded_for或自定义 header 区分真实客户端(需上游透传)
限制并发连接数防拖垮
针对下载、长轮询或流媒体类请求,用 limit_conn 控制同时连接上限:
- 定义连接区:
limit_conn_zone $binary_remote_addr zone=addr_conn:10m; - 在 location 中限制:
limit_conn addr_conn 20;(单个 IP 最多 20 个并发连接) - 注意:该计数只统计已读完请求头的连接,不包含 TCP 握手阶段的半开连接
- 若需全局限制,可放在
server或http块;若只限某路径,放location更精准
封禁与白名单结合使用
对已知恶意 IP 或可信内网,用黑白名单快速过滤:
- IP 黑名单:在
http或location中写deny 192.168.10.5;、deny 203.0.113.0/24;,最后加allow all;放行其余 - IP 白名单(如后台管理):
deny all;开头,再逐条allow 10.0.0.0/16;、allow 2001:db8::/32; - User-Agent 过滤(慎用):
if ($http_user_agent ~* "(curl|wget|sqlmap)") { return 403; },适合识别明显工具流量
配合超时与连接复用减少资源占用
限制本身不释放连接,需搭配连接生命周期管理:
- 缩短 keepalive 超时:
keepalive_timeout 25s;(默认 75s,20–30s 更适合高并发场景) - 提高单连接复用次数:
keepalive_requests 500;(减少反复建连开销) - 调大文件描述符上限:
worker_rlimit_nofile 65536;,并确保系统级 ulimit 同步调整 - 启用
tcp_nodelay on;和tcp_nopush on;,优化小包传输效率


















