自己的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
为请求限流,每秒放行多少请求;
这个可以,一般开启waf的话也差不多能起到这个效果吧?
waf也可以达到类似的效果,但是我没有折腾懂waf