nginx官方文档:http://nginx.org/en/docs/
本次使用到的模块是:ngx_http_limit_req_module
主要配置如下:
### http区域
limit_req_log_level info;
limit_req_status 400;
limit_req_zone $remote_addr zone=req_limit_per_ip:1m rate=1r/m;
### server或location区域(支持反代)
limit_req zone=req_limit_per_ip burst=5 nodelay;
主要参数:
$remote_addr:限制的依据,是nginx的变量(内部,自定义都可以);淘宝的tengine支持多个变量
zone:名称及缓存大小
rate:频率,单位:r/s,r/m
burst:访问超过频率后的延迟个数,客户端一直处于等待状态,多余的请求直接返回异常状态码
nodelay:延迟不等待,直接正常响应请求
漏桶算法:形似漏桶
漏口大小就是限制的频率(rate),单位时间只处理一定的量;漏桶上部较宽的区域用于存放等待处理的延迟(burst),延迟的数量可以设定;当请求超过rate+burst就会溢出,直接返回错误状态码(默认是503)
异常:不生效配置
### 返回自定义文本
location /site-info {
add_header Cache-Control no-store;
add_header Content-Type "text/plain;charset=utf-8";
return 200 "Site:$host\nYour IP:$remote_addr";
limit_req zone=req_limit_per_ip burst=4 nodelay;
}
### 返回自定义json内容
location /update.json {
default_type application/json;
return 200 ‘{"version":"1.2.0"}‘;
limit_req zone=req_limit_per_ip burst=5;
}
以上两种配置,无论怎么调整zone,配置的限制都不生效,总是感觉量达不到,但我用ad测试的命令如下:
# ab -n 500 -c 5 -t 30 http://testd.forver.com/
理论上早达到了限制,应该直接返回异常状态。只能有空再深究了。
原文地址:http://blog.51cto.com/11424123/2089247
时间: 2024-10-07 18:46:09