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

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

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

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

自定义503页面

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

参数说明

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