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/
理論上早達到了限制,應該直接返回異常狀態。只能有空再深究了。