自己的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页面
参数说明
参数补充说明:
$binary_remote_addr 是限制同一客户端ip地址;
$server_name 是限制同一server最大并发数;
limit_conn 为限制并发连接数;
limit_rate 为限制下载速度;
burst 为请求限流,每秒放行多少请求;