钧言极客站钧言极客

钧言极客

利用Nginx限制API接口刷流量

自己的API随机图接口,最近发现有人在爬图片导致源站压力过大,不得不做出亿点点优化。众所周知服务器的资源是有限的,但客户端的请求是无限的(狂点F5) ,但是为了用户请求能够正常响应,这个时候就要抛弃一些不正常的客户端请求。

这里我使用环境为NGINX,这里以NGINX为例来实现限制流量或者非正常IP的访问。访问到设置阈值后,直接抛出503或者444错误给客户端来限制不正常访问。

这里使用了NGINX的以下内置功能,可以运行nginx -V来查看是否开启

  • ngx_http_limit_conn_module
  • ngx_http_limit_req_module
http {
#限制请求(单IP,每秒读20次、写10次)
limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=20r/s; 
limit_req_zone $binary_remote_addr $uri zone=api_write:20m rate=10r/s;
#按ip配置一个连接 zone
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
#按server配置一个连接 zone
limit_conn_zone $server_name zone=perserver_conn:100m;
}
server {
        listen  80; 
        server_name localhost;
        location / {
              #请求限流排队通过 burst默认是0
              limit_req zone=api_read burst=5;
              #连接数限制,每个IP并发请求为10
              limit_conn perip_conn 10;
              #服务所限制的连接数(即限制了该server并发连接数量)
              limit_conn perserver_conn 1500;
              #连接限速
              limit_rate 100k;
        }
}

自定义503页面

error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /usr/local/nginx/html;
}

参数说明

参数补充说明:
$binary_remote_addr 是限制同一客户端ip地址;
$server_name 是限制同一server最大并发数;
limit_conn 为限制并发连接数;
limit_rate 为限制下载速度;
burst 为请求限流,每秒放行多少请求;

版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《利用Nginx限制API接口刷流量》
文章链接:https://www.jinjun.top/363.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 2

  1. 这个可以,一般开启waf的话也差不多能起到这个效果吧?

    流金岁月 2021年01月04日    回复
    • waf也可以达到类似的效果,但是我没有折腾懂waf

      ღ钧言ღ 2021年01月04日    回复