nginx 简单限流场景实现 以及自定义限流返回

后台系统稳定支持高并发服务的几大手段 缓存 异步 扩容 降级 限流

这里聊聊通过nginx限流的简单配置

一般可以配置到 http 模块下 增加如下配置

 ###secrity setting start
    limit_req_zone  $binary_remote_addr  zone=java:50m   rate=20r/s;
    limit_req_zone  $server_name zone=perserver:50m rate=3500r/s;
    limit_req_zone  $uri zone=perport:50m rate=2000r/s;
    limit_req_log_level error;

第1个参数:limit_req_zone nginx 限流关键字  $binary_remote_addr表示保存客户端IP地址的二进制形式 $uri表示根据请求uri限流 linux内置变量在文末有所整理
第2个参数:Zone定义IP状态及URL访问频率的共享内存区域。zone=keyword标识区域的名字,以及冒号后面跟区域大小。16000个IP地址的状态信息约1MB。
第3个参数:Rate定义最大请求速率。示例中速率不能超过每秒20个请求。

limit_req_log_level 定义了限流日志的错误级别

以上只是我们定义了限流规则 要让其生效 还需在 location 模块下进行引入

location / {
        proxy_pass          http://local_worker;
        proxy_redirect      off;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    Host $remote_addr;
        proxy_http_version  1.1;
        proxy_set_header    Connection "";

        limit_req zone=perport burst=1 nodelay;
    }

如上所示 我们引入了 标识为 perport的 限流规则 burst 用来处理突发流量 相当于维护了一个等待队列 nodelay针对的是burst参数 表示其定义的请求需要马上处理 不能延迟 但速率受已定义速率的影响

nginx限流会返回 503 状态码 如果想要返回自定义的json 需要增加以下配置

error_page 503 /503;
#503限流返回默认值
location /503 {
    default_type application.json;
    add_header Content-Type 'application/json; charset-utf-8';
    return 200 '{"code":"E11111","data":null,"message":"service busy"}';
}
$args : #这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$document_root : 当前请求在root指令中指定的值。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$limit_rate : 这个变量可以限制连接速率。
$request_method : 客户端请求的动作,通常为GET或POST。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。

 

你可能感兴趣的:(java,nginx,nginx,java)