自己的API随机图接口,最近发现有人在爬图片导致源站压力过大,不得不做出亿点点优化。众所周知服务器的资源是有限的,但客户端的请求是无限的(狂点F5) ,但是为了用户请求能够正常响应,这个时候就要抛弃一些不正常的客户端请求。
这里我使用环境为NGINX,这里以NGINX为例来实现限制流量或者非正常IP的访问。访问到设置阈值后,直接抛出503或者444错误给客户端来限制不正常访问。
这里使用了NGINX的以下内置功能,可以运行nginx -V
来查看是否开启
- ngx_http_limit_conn_module
- ngx_http_limit_req_module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| http {
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;
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
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页面
1 2 3 4
| 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
为请求限流,每秒放行多少请求;