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/

理论上早达到了限制,应该直接返回异常状态。只能有空再深究了。