概述
背景
有时候由于数据库或者应用层压力过大,所以需要对接口服务进行限流。
Nginx限流
Nginx本身支持限流功能,不过只有几个经典的限流场景,如果需要复杂的限流场景需要lua支持。
# Nginx限流参考官网如下:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
# limit_req模块使用的是漏桶算法,参考如下:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req
(1) 使用limit_req_zone与limit_req 进行限流
示例:
# you do not need the following line if you are using
# the OpenResty bundle:
## nginx的经典限流
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
listen 80;
server_name xyz.cn;
location /test {
limit_req zone=one burst=5;
content_by_lua_block {
ngx.say("ccccccc")
}
}
access_log /home/data/logs/xyz.cn/xyz.cn.access.logstash_json logstash_json;
access_log /home/data/logs/xyz.cn/xyz.cn.access.log access;
}
解析:
下面分别是按照ip和server来限流rps,
zone=perip_rps:10m是设定这个limit_req_zone的名字为perid_rps,且在nginx内存里分配10m的空间来存储访问频次信息,rate=15r/s表示每秒15个请求,30r/m每分钟30次请求。
在 http 段 里配置好了limit_req_zone之后,就可以在server或者location里边配置limit_req
# 单ip每秒限制5个请求
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=5r/s;
# 每个server每秒限制处理3000个请求
limit_req_zone $server_name zone=perserver_rps:10m rate=3000r/s;
(2)使用 limit_conn_zone与limit_conn 进行限流
##
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
limit_conn perip_conn 10; # 每个ip最多允许10个连接
Nginx配置示例:
# you do not need the following line if you are using
# the OpenResty bundle:
## nginx的经典限流-02
#每秒请求数
limit_req_log_level error;
limit_req_status 503;
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=15r/s; #单ip每秒限制15个请求
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
server {
listen 80;
server_name xyz.cn;
# 秒杀接口
location /seckill {
limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
limit_conn perip_conn 10; #每个ip最多允许10个连接
content_by_lua_block {
ngx.say("秒杀接口")
}
}
access_log /home/data/logs/xyz.cn/xyz.cn.access.logstash_json logstash_json;
access_log /home/data/logs/xyz.cn/xyz.cn.access.log access;
}
Nginx限流场景总结
- 单ip需要限制连接数、以及rps ,防止恶意请求脚本来刷服务器。
# http
limit_req_zone $binary_remote_addr zone=perip_rps:10m rate=5r/s; #单ip每秒限制5个请求
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
# location
limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
limit_conn perip_conn 5; #每个ip最多允许同时5个连接
2. 重点location接口使用漏桶或令牌桶平滑限制rps,保护后端的核心服务
#http
limit_req_zone $server_name zone=perserver_rps:10m rate=1500r/s; #每个server每秒限制处理1500个请求
#server
limit_req zone=perserver_rps burst=100 nodelay; #server每秒请求限流
或者使用openresty:
upstream seckillcore {
server 127.0.0.1:8921 max_fails=3 fail_timeout=3s weight=1;
}
location /seckill {
limit_req zone=perip_rps burst=10 nodelay; #每个ip每秒请求如果超过limit_req_zone的配置,最多可以缓冲10个
limit_conn perip_conn 5; #每个ip最多允许5个连接
default_type text/html;
# 在access阶段使用resty.limit.req做令牌桶或者漏桶限流
access_by_lua_file lua/xx/seckill/appointment_check.lua;
proxy_pass http://seckillcore;
proxy_redirect default;
# log_by_lua_file src/log.lua; # 如果是漏桶那么在log阶段ngx.sleep(delay),如果是令牌桶则不需要
}
OpenRestry限流
# 配置生效
/usr/local/openresty/bin/openresty -s reload
# 或者
nginx -s reload
# 压测
wrk -t8 -c100 -d10s --latency http://xyz.cn/test01
最后
以上就是美满戒指为你收集整理的基于OpenResty 的降级限流的全部内容,希望文章能够帮你解决基于OpenResty 的降级限流所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复