nginx限制客户端请求频率,防止恶意攻击

模块: ngx_http_limit_req_module

作用: 限制客户端请求频率,防止恶意攻击

配置示例:

http {
    limit_req_zone $binary_remote_addr zone=req_perip:50m rate=10r/s;

    ...

    server {

        ...

        location /api/ {
                limit_req zone=req_perip burst=50 nodelay;
                limit_req_status 503;
        }
    }
}

说明: 区域名称为req_perip,分配内存大小为50m(如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503),同一个ip平均处理的请求频率不能超过每秒10次; 如果超过每秒10次但超过的请求数量小于等于50(burst)时,会延迟请求。如果超过每秒10次的请求数超过50,则立即返回503给客户端

涉及指令:

  limit_req_zone

  limit_req

  limit_req_status

  limit_req_log_level

指令详解:

limit_req_zone(可理解为该指令用来定义限制请求频率) 

语法: limit_req_zone key zone=name:size rate=rate;
可配置区域: http

key: 必选项;取值范围: 1,text(文本); 2,nginx变量;3,text和nginx变量的组合; 注: 1.7.6版本之前取值只能是nginx变量
name: 必选项;自定义字符串
size: 必选项;分配内存大小,用来保存键值的状态参数
rate: 必选项;每秒可请求的频率(r/s), 或每分钟可请求的频率(r/m)

  

limit_req (可理解为使用定义的限制请求频率,一定是先定义后使用!也就是一定要有limit_req_zone指令的配置后才能使用该配置)

语法: limit_req zone=name [burst=number] [nodelay];
可配置区域: http, server, location

name: 必选项;自定义字符串, 名字必须与limit_req_zone中zone=name这个名字一致
number: 必选项;正整数数字, 平均每秒允许不超过limit_req_zone指令中rate规定的请求数,并且不会超过该值所指定数量的请求, 可延迟请求的数量
nodelay: 可选配置, 表示请求频率超过rate规定值后又超过burst规定值后立即返回客户端503(可设置返回code)

  

limit_req_status 

语法: limit_req_status code;
默认值: 503
可配置区域: http, server, location

表示超出limit_req配置的请求数量后返回给客户端的错误码

使用该指令最低版本 1.3.15

  

limit_req_log_level

语法: limit_req_log_level info | notice | warn | error;
默认值: limit_req_log_level error;
可配置区域: http, server, location

当服务器拒绝处理由于速率超过或延迟请求处理而拒绝处理请求时,设置所需的日志记录级别。

最低版本: 0.8.18

  

常见错误:

  nginx: [emerg] zero size shared memory zone "oneip"

   出现此错误都是因为在未指定limit_req_zone指定就使用了limit_req指令的原因(或者limit_req中的name值和limit_req_zone中定义的name值不一致) 

时间: 2024-10-27 08:50:21

nginx限制客户端请求频率,防止恶意攻击的相关文章

Nginx(防止压力测试的恶意攻击)

ab压力测试工具命令: ab -c 100 -n 1000 http://127.0.0.1/index.html 防止压力测试的恶意攻击的思路: nginx限制同一个IP的并发最大为10, vi /usr/local/nginx/conf/nginx.conf 在http{} 字段第一行添加: limit_conn_zone $binary_remote_addr zone=one:10m; 在对应的server{}里添加: limit_conn one 10; 最后重启nginx,有两种方法

nginx常用的请求头参数和防DDOS攻击

前端squid反向代理到nginx nginx根据http_user_agent防DDOS 首先查看访问日志,找出可疑访问 找到http_user_agent 的特征,然后再作过滤 "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate" if ($http_user_agent ~ must-revalidate) { return

nginx 限制ip的请求频率

总是有人很清闲的扫我的网站 ,所以要限制一下了 先来看看没有限制的时候,并发10 100次 服务器一直在正常响应  限制一下,之后再测试一下 返回503 ,嗯,放心多了.这样就不用担心有人恶意攻击了 原文地址:https://www.cnblogs.com/jnhs/p/10740500.html

用nginx实现分布式限流(防DDOS攻击)

1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2. 首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 package com.anuo.app.controller; import org.slf4j.Logger; import org.slf4j.

通过配置nginx 抵御不合法请求

ngx_http_limit_conn_module模块 使用此模块主要用来限制每秒请求数量,至于依据什么条件限制是由我们来自定义的.官方文档 Module ngx_http_limit_req_module中文翻译的 nginx限制请求数ngx_http_limit_req_module模块 文档讲的很详细了,大致说下:limit_req_zone $variable zone=name:size rate=rate;命令的意思是,以$variable变量为条件,起名为name,设置的存储空间

DDOS的攻击原理和如何防护网站和游戏恶意攻击

DDOS的攻击原理和如何防护网站和游戏恶意攻击                 1-DDOS全名是Distribution Denial of Service (分布式拒绝服务攻击),很多DOS攻击源一起 攻击某台服务器就组成了DDOS攻击.在中国,DDOS 最早可追溯到1996年,2002年开发频繁出现,2003 年已经初具规模.当时网络带宽普遍比较小,攻击量一般都不会超过100M,国内几乎没有防护的方法 和产品. 而且攻击源IP都是伪造的,无法找到攻击源.一个硬件配置很好的网站,每秒几兆的攻

防止恶意攻击短信验证码接口方法

1.手机号码限制:限制单个手机号码每天的最大发送次数.超过次数不能发送短信,可以考虑将手机号码加入黑名单,禁止1天.2.短信发送时间间隔限制:限制同一个手机号码重复发送的时间间隔.通常设置为60-120秒,前端做倒计时限制,时间未到不能点击发送短信按钮,后台也做时间间隔限制,时间未到不能发送短信.3.IP地址限制:限制每个IP地址每天的最大发送次数.防止通过同一个IP地址不同手机号码进行恶意攻击.超过次数不能发送短信,可以考虑将IP地址加入黑名单,禁止1天.可以考虑限制同一个IP地址每分钟的接口

天下数据支招应对网站频频遭受恶意攻击

人在江湖飘,谁能不挨刀.这句颇为慷慨的话来形容我们的网站是最合适不过了.特别是对于虚拟主机用户,当机房服务器收到攻击时,服务器内的所有站点都会受到牵连,而各种各样的恶意攻击肆虐的入侵着互联网.今天就和天下数据一起来探讨下应对各种恶意攻击的法子吧! 网站被攻击后常见状况有:网页乱码.网站无法打开.甚至是服务器空间崩溃.会对我们的网站造成毁灭性的的影响,排名消失.访客流失.快照回档,让你的网站直接回到解放前. 恶意攻击的种类一般有三种DDOS攻击..CC攻击.ARP攻击. DDOS攻击是最常见,同时

Nginx 向客户端输出真实的后端IP地址

因为涉及到内外网的改造,所以狠多东西现在需要依赖于openresty来做总控实现.然后就碰见了一个比较难办的问题,即在upstream时候,如何获取实际处理请求的server地址.假设有如下upstream配置: upstream backend { server 127.0.0.1:88882 server 127.0.0.1:88892 } location /test { proxy_pass http://backend2 } 当我请求test的时候,我同时想直到到底是backend的哪