Nginx典型静态流控配置(ngx_http_limit_req_module)
1、基于请求头字段进行连接数流控
配置示例:
# 限流配置定义,其中键可以为文本、变量或者任意的组合,特别的,具有空键值的请求将不会被计入 # $http_limit_header 标识基于请求头limit-header进行流控 # zone=req_limit_for_header:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求 limit_req_zone $http_limit_header zone=req_limit_header:10m rate=1r/s; server { listen 8000; location / { # 应用限流,burst=5 允许5个突发请求排队,nodelay不延迟处理排队请求 limit_req zone=req_limit_header burst=5 nodelay; root html; index index.html index.htm; } }
2、定制限流响应界面
server { listen 8000; # 定义限流响应页面:采用429状态码 # limit_req_status优先级高于location中return指令指定的响应码 limit_req_status 429; # 使用429状态码(请求过多) error_page 429 /too_many_requests; location / {
# 应用限流
# burst=5 允许5个突发请求排队
# nodelay不延迟处理排队请求
# delay=num用于指定阈值,超出该阈值的过多请求才会被延迟,默认为0即代表所有的过多请求都会被延迟
limit_req zone=req_limit_header burst=5 nodelay; root html; index index.html index.htm; } # 自定义限流响应页面 location = /too_many_requests { internal; # 只允许内部访问 return 429 '<html><body>Too many request!</body></html>'; } }
3、应用多种流控策略
# 限流配置定义 # $http_limit_header 标识基于请求头limit-header进行流控 # zone=req_limit_for_header:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求 limit_req_zone $http_limit_header zone=req_limit_header:10m rate=1r/s; # $binary_remote_addr 标识基于客户端地址进行流控 # zone=req_per_clt:10m 定义共享内存用于存储状态,rate=1r/s 限制每秒1个请求 limit_req_zone $binary_remote_addr zone=req_per_clt:10m rate=1r/s; server { listen 8000; # 定义限流响应页面:采用429状态码 # limit_req_status优先级高于location中return指令指定的响应码 limit_req_status 429; # 使用429状态码(请求过多) error_page 429 /too_many_requests; location / { # 应用限流 # burst=5 允许5个突发请求排队 # nodelay不延迟处理排队请求 # delay=num用于指定阈值,超出该阈值的过多请求才会被延迟,默认为0即代表所有的过多请求都会被延迟 limit_req zone=req_limit_header burst=5 nodelay; limit_req zone=req_per_clt burst=5 nodelay; root html; index index.html index.htm; } # 自定义限流响应页面 location = /too_many_requests { internal; # 只允许内部访问 return 429 '<html><body>Too many request!</body></html>'; } }
Tip
limit_req_log_level warn 设置因请求速率超出限制或延迟处理请求时所需的日志记录级别(error.log),对于延迟的请求级别比拒绝情况的低一个级别
limit_req_dry_run 启用dry run模式。在该模式下请求处理速率不受限制,但在共享内存区域,超出的请求数量仍会进行统计,error.log仍会记录错误日志
$limit_req_status 限制请求处理速率的结果:PASS(通过)、DELAY(延迟)、REJECT(拒绝)、DELAY_DRY_RUN(延迟预演)或 REJECT_DRY_RUN(拒绝预演),通常结合访问日志使用