nginx使用Limit Requests模块限制单个IP请求速率的方法

[ 2016-08-03 22:02:28 | 作者: admin ]
字号: | |
p.s. nginx里面有2个模块可以限制客户端的访问频率:limit_req和limit_conn ,具体的区别可以再查,这里只讲述 limit_req ,一般也够用了。
p.s. 如果修改配置不生效,需要杀进程重新开 nginx 。参考: http://blog.xg98.com/article.asp?id=2656


本文介绍下,nginx环境中使用Limit Requests模块,限制单个IP请求速率的方法,有需要的朋友,参考下吧。

Limit Requests模块可以限制单个客户端发送请求的速率。

示例配置如下:
http {
     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
     server {
             location ~ .*\.(php|php5)?$
             {
                     limit_req zone=one burst=5 nodelay;
                     fastcgi_pass unix:/tmp/php-cgi-www.jbxue.com.sock;
                     fastcgi_index index.php;
                     include fcgi.conf;
                }
}

以上配置,限制单个客户端请求php动态文件的速率是每秒一个请求,峰值是5个请求。

附,nginx利用limit模块设置IP并发防CC攻击

在nginx.conf 中的http字段下面加入:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ##平均 1r/s 每秒1个请求

然后,在server下配置的主机定义文档中加入如下一行(全局就加在server下面)
limit_req zone=one burst=8;队列模式
limit_req zone=one burst=8 nodelay; ###不用队列 默认的突发(burst是0)

如果只想限制php的请求,加在location中:
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=8 nodelay;

重加载nginx:
nginx -s reload

比如nginx.conf的http段配置:
limit_req_zone $binary_remote_addr zone=req:20m rate=100r/s;
limit_req zone=req burst=150;


“limit_req_zone $binary_remote_addr zone=req:20m rate=100r/s;”
相当于在nginx创建了一个检查站,名字叫req,凡是跟req相关的请求,并限定检查速率是100r/s。
所以当使用“limit_req zone=reqburst=150;”指定某些请求需要经过req时,请求的速率就被限制为100r/s,通过查看日志,可以检测到验证结果。

然后就是burst=150了。这相当于在检查站req旁边放150个座位。如果某个请求当时超过速度限制被拦了,请他在空座位上坐着,等排队,如果检查站空了,就可以通过。如果连座位都坐满了,那就抱歉了,请求直接退回,客户端得到一个服务器忙的响应。

因此,burst跟request_rate一点关系都没有,设成10000,就是1万个请求可以等着排队,而检查站还是1秒钟放行100个请求(龟速)。而且也不能一直排队,所以nginx还设了超时,排队超过一定时间,也是直接退回,返回服务器忙的响应。

就是这些了,在某些特定的环境或需求中,确实要进行限速或防止CC攻击,希望以上的方法,可以帮助到大家。
[最后修改由 admin, 于 2020-03-31 15:56:41]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2331

这篇日志没有评论。

此日志不可发表评论。