网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击

网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击,第1张

对于网站来说,尤其是流量较大出名的网站,经常遇到攻击,如DDOS攻击等,虽然有些第三方,如Cloudflare可以挡,但对于动态网站PHP来说,只能挡一部分。这时候需要对于单个IP恶意攻击做出限流。nginx的两个模块可以限流。

nginx两个限流模块:

连接频率限制,ngx_http_limit_conn_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

请求频率限制,ngx_http_limit_req_module:官方文档:https://nginx.org/en/docs/http/ngx_http_limit_req_module.html

网上理论很多,根据名字可知:

当然还是看不懂的话,通俗点讲(相对于时间比较):

比如秒杀,抢购,连接频率限制和请求频率限制应该配合使用 , 使用连接频率限制同一IP同时只能有3个连接, 再使用请求频率限制对于同一ip的请求,限制平均速率为5个请求/秒 , 这样比单独只使用一种限制要好很多。

比如只使用请求频率限制 , 可以精确地限制同一ip1秒只能发起5次的http请求 , 假如同一ip1秒内发起了100000次请求 , 虽然限制了只有5次成功响应 , 但是其他的99995次的请求TCP握手建立http连接是不是会消耗服务器资源? 所以还需要配合使用。

1、limit_req_zone,示例:

2、limit_conn_zone,示例:

3、搭配一起使用

1、ab命令

ab是apache自带的压力测试工具。一般不用额外安装,ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。

测试命令

2、wrk命令

需自己安装,地址:https://github.com/wg/wrk

安装

测试命令:

还有其他压测工具,自行研究

最近老大布置任务,需要对网站进行限流,要求每个IP每秒只能访问1次。百度后,发现nginx的limit_req 命令基本可以满足我们的需求。

配置如下:

以上配置中使用的是nginx的ngx_http_limit_req_module模块,用来限制单个IP的请求数。

语法:limit_req_zonebinary_remote_addr zone=mylimit:10m rate=1r/s

说明:

1. $binary_remote_addr,表明是以remote_addr为限制目标,加上binary是为了压缩内存占用空间

2. zone=name:size,分配一个以name为名的并且大小为size的内存空间,用来存储访 问的频次信息

3. rate=rate, 如rate=1r/s表示同一个IP每秒只允许一个请求通过

语法:limit_req zone=name [burst=number] [nodelay | delay=number] #放在location区域内

实例:limit_req zone=mylimit burst=5 nodelay

说明:

1. zone=mylimit,对应http区域中配置的zone

2. burst=5,表示设置一个大小为5的缓冲区,超过频次限制的请求先放入这个缓冲区

3. nodelay,设置后超过频次限制以及缓冲区满了的情况下返回503状态码;如不设置,那么额外的请求将进入等待排队的状态

语法:limit_req_log_level info | notice | warn | error #可放入http, server, location区域

实例:limit_req_log_level error

说明:当超出限速及被缓存后,写入日志(对应相应的日志级别)

语法:limit_req_status code #可放入http, server, location区域

实例:limit_req_status 503

说明:自定义拒绝请求后返回的状态码

参考: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

https://www.cnblogs.com/biglittleant/p/8979915.html

nginx中针对目录进行IP限制 ,这里以phpmyadmin目录只能让内网IP访问,而外网不能访问的配置方法。

nginx phpmyadmin 针对内网ip用户开放、外网ip用户关闭(在前面的配置中,location ~ ^/目录/使用正则, 优先级高于location /的配置,所以nginx无法对首页进行解析)

代码如下:

server {

  listen       80

  server_name example.com

  access_log logs/access.log main

  location / {

      root   html

      index index.php index.html index.htm

  }

location ~ ^/phpmyadmin/ {

      allow 192.168.1.0/24

      deny all

      location ~ .*.(php|php5)?$ {

          root /var/mailapp/nginx/html

          fastcgi_pass   127.0.0.1:9000

          fastcgi_index index.php

          include        fastcgi_params

      }

  }

location ~ .*.(php|php5)?$ {

      root /opt/nginx/html

      fastcgi_pass   127.0.0.1:9000

      fastcgi_index index.php

      include        fastcgi_params

   }

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/602619.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-11
下一篇2023-07-11

发表评论

登录后才能评论

评论列表(0条)

    保存