NGINX 和 NGINX Plus 的速率限制功能
原文作者:Amir Rawdat - F5 NGINX 技术营销工程师原文来源:NGINX 中文官网
速率限制是 NGINX 最有用的功能之一,却往往被误解,且未能得到正确配置。此功能可以限制单个用户在给定时长内可发起的 HTTP 请求数量。此类请求可能非常简单,例如网站主页的 GET 请求,或登录页面的 POST 请求。速率限制可用于安全目的,例如减缓暴力破解密码的攻击频率。此功能可以将传入的请求速率限制为实际用户的典型值,(通过日志记录)识别目标 URL,从而达到防范 DDoS 攻击的目的。再概括一点说,可以防止上游应用服务器因同时服务过多用户请求而不堪重负。这篇博文将介绍如何使用 NGINX 进行速率限制,包括基础知识和高级配置。在NGINX Plus 中,速率限制的工作原理相同。
NGINX 速率限制的工作原理
速率限制基本配置
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; server { location /login/ { limit_req zone=mylimit; proxy_pass http://my_upstream; } }
limit_req_zone 指令用于定义速率限制的参数,而 limit_req 在其出现的上下文环境中启用速率限制(在本例中,应用于指向 /login/ 的所有请求)。
处理突发流量
location /login/ { limit_req zone=mylimit burst=20; proxy_pass http://my_upstream; }
burst 参数用于定义客户端在该区域定义的速率上限之外还可以发出的请求数量(以 mylimit 区域为样本,速率限制为每秒 10 个请求,即每 100 毫秒 1 个请求)。在前一个请求后 100 毫秒内到达的请求会加入队列,这里我们将队列容量设置为 20。
无延迟队列
location /login/ { limit_req zone=mylimit burst=20 nodelay; proxy_pass http://my_upstream; }
二段式速率限制
limit_req_zone $binary_remote_addr zone=ip:10m rate=5r/s; server { listen 80; location / { limit_req zone=ip burst=12 delay=8; proxy_pass http://website; } }
Delay 参数定义了一个点,在突发请求上限内,超出这个点的请求会被限流(延迟),从而达到已定义的速率限制标准。使用此配置,以 8 r/s 速率连续发出请求的客户端会经历如下行为。
高级配置示例
geo $limit { default 1; 10.0.0.0/8 0; 192.168.0.0/24 0; } map $limit $limit_key { 0 ""; 1 $binary_remote_addr; } limit_req_zone $limit_key zone=req_zone:10m rate=5r/s; server { location / { limit_req zone=req_zone burst=10 nodelay; # ... } }
本例同时使用了 geo 和 map 指令。geo 模块为允许列表中 IP 地址的 $limit 赋值 0,为所有其他 IP 地址的 $limit 赋值 1。然后,我们使用 map 指令将这些值转换为关键字,例如:
- 如果 $limit 值为 0,则 $limit_key 设为空字符串
- 如果 $limit 值为 1,则 $limit_key 设为二进制格式的客户端 IP 地址
http { # ... limit_req_zone $limit_key zone=req_zone:10m rate=5r/s; limit_req_zone $binary_remote_addr zone=req_zone_wl:10m rate=15r/s; server { # ... location / { limit_req zone=req_zone burst=10 nodelay; limit_req zone=req_zone_wl burst=20 nodelay; # ... } } }
允许列表中的 IP 地址不符合第一个速率限制条件 (req_zone),但符合第二个条件 (req_zone_wl),因此被限制为每秒 15 个请求。允许列表以外的 IP 地址同时符合两个速率限制条件,因此更严格的一项限制生效:每秒 5 个请求。
配置相关功能
2015/06/13 04:20:00 [error] 120315#0: *32086 limiting requests, excess: 1.000 by zone "mylimit", client: 192.168.1.2, server: nginx.com, request: "GET / HTTP/1.0", host: "nginx.com"
日志条目包含以下字段:
- 2015/06/13 04:20:00 – 日志的录入日期和时间
- [error] – 错误等级
- 120315#0 – NGINX worker 的 process ID 和 thread ID,以 # 号分隔
- *32086 – 速率受限的代理连接的 ID
- limiting requests – 表明日志条目记录到一次速率限制
- excess – 显示此请求超过配置速率的每毫秒请求数
- zone – 定义了强制执行速率限制的区域
- client – 发出该请求的客户端 IP 地址
- server – 服务器的 IP 地址或主机名
- request – 客户端发出的实际 HTTP 请求
- host – Host HTTP 的 header 值
location /login/ { limit_req zone=mylimit burst=20 nodelay; limit_req_log_level warn; proxy_pass http://my_upstream; }
发送至客户端的错误代码
location /login/ { limit_req zone=mylimit burst=20 nodelay; limit_req_status 444; }
location /foo.php { deny all; }
结语

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
告别SQL卡顿与混乱!AI如何赋能实时计算?
在当今数据驱动的商业环境中,SQL作为与数据库交互的核心语言,其编写效率和质量直接影响着企业的数据决策速度和系统性能。然而,我们在长期的企业服务实践中发现,数据库开发人员普遍面临以下痛点: SQL性能问题频发:约65%的性能问题源于低效SQL,但开发人员缺乏专业的优化指导 知识传承困难:复杂的业务SQL往往缺乏文档说明,新成员理解成本高 错误诊断耗时:平均每个SQL错误需要45分钟排查,严重影响开发效率 这些痛点导致企业SQL开发效率低下,平均每个开发人员每天要花费2-3小时在SQL相关问题的处理上。 基于以上问题,袋鼠云实时开发平台引入了智能AI,深度集成于企业数据库开发环境,提供从SQL编写、优化到运维的全生命周期智能支持。助力企业开发效率提升40%+、性能问题减少60%、有效缩短新人上手时间。 重点功能介绍 智能优化 平台提供SQL语句性能优化建议,并支持一键替换原SQL。 智能注释 对SQL语句添加注释,方便理解表的作用及SQL的作用。其中注释内容包含:各数据表的业务含义、SQL的总体功能描述、关键操作步骤说明。 智能解释 平台支持解析选中SQL的业务...
- 下一篇
向量检索算法:从哈希、树到量化与图
向量检索这门技术,其发展由来已久,可以追溯到上世纪六七十年代。1975 年发表的 KD 树算法,就是早期经典的高维数据检索算法之一。然而,此后近四十年间,向量检索长期处于冷门状态,并没有特别多的应用需要它。 直到 2015 年,ImageNet 图片分类数据集及何恺明教授的 ResNet 等突破性论文引爆了深度学习,使得模型在多个任务上超越人类。推荐系统和搜索引擎快速成为向量检索技术主要落地场景,向量引擎也由此开始大规模应用。 大模型爆发又掀起第二轮热潮:基于向量检索的 RAG 架构,已成为解决模型幻觉、实现知识实时更新的关键技术,推动其在多模态、企业知识库等场景爆发式应用。 不久前,开源中国直播栏目《数智漫谈》邀请到了傅聪博士,分享了向量检索技术的发展情况。傅聪于浙江大学计算机博士毕业,曾赴美国南加州大学访问研究,其主导发明的 NSG、SSG、PSP、MAG 等高性能检索算法,已落地为千亿级向量检索系统,成为工业界大规模检索的标杆方案。目前,傅聪博士在shopee(新加坡)担任资深算法专家,专注于 AI 大规模应用落地方面的研究。 微信扫码,观看直播回放: 本文根据直播整理,介绍四种...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS6,CentOS7官方镜像安装Oracle11G