公司某系统经常出现短时间内同一用户大量并发访问的情况,疑似爬虫行为,该行为经常导致应用节点连接超时频发的问题。由于业务代码层对用户的限速和限制并发的能力有限,因此决定采用F5后添加nginx反向代理,通过nginx的limit_req_zone模块进行限速,通过limit_conn_zone模块来进行限制并发。
首先利用nginx的内置变量$http_x_forwarded_for获取远端的访问IP,以该变量来进行访问限速。具体访问策略如下:
▼▼▼
http {
include mime.types;
default_type application/octet-stream;
......(常规配置忽略)
#gzip on;
#限速策略
limit_req_zone $http_x_forwarded_for zone=req:100m rate=10r/m;
limit_conn_zone $http_x_forwarded_for zone=reqconn:100m;
upstream shsnc {
sticky;
server IP:PORT;
server IP:PORT;
server IP:PORT;
}
server {
listen 80;
......(常规配置忽略)
#仅对访问频繁的页面加以限速,aa表示页面URL的关键字段)
location ~ .*(aa|bb).* {
proxy_pass http://shsnc;
limit_req zone=reqzone burst=5;
limit_conn reqconn 10;
}
}
由于用户是通过统一的出口IP来访问业务,以上配置仅对出口IP限速,无法对单个用户访问进行限速,因此导致用户访问比较多时,个别用户出现无法访问业务的情况。因此,改用$http_cookie的方式来进行限速。经过查看,发现http_cookie变量中的信息量过多,格式如下所示:
▼▼▼
JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxx;
Hm_lvt_fxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
BIGipxxxxxxxxxxxxxxxxxxxx=xxxxxxxxxxxxxxxxxxxxx;
route=xxxxxxxxxxxxxxxxxxxxxxxxxxx;
从上面的格式分析,使用JSESSIONID的值去进行限速比较合理。因此,需要从http_cookie变量中截取JSESSIONID的值作为限速的依据。最终确定方案如下:
▼▼▼
http {
include mime.types;
default_type application/octet-stream;
......(常规配置忽略)
#gzip on;
#限速策略
limit_req_zone $jsvalue zone=req:100m rate=10r/m;
limit_conn_zone $jsvalue zone=reqconn:100m;
upstream shsnc {
sticky;
server IP:PORT;
server IP:PORT;
server IP:PORT;
}
server {
listen 80;
......(常规配置忽略)
#截取设置限速jsessionid字符串
set $jsvalue "";
if ( $http_cookie ~* "JSESSIONID=(.+?)(?=;)" ) {
set $jsvalue $1;
}
#仅对访问频繁的页面加以限速,aa表示页面URL的关键字段)
location ~ .*(aa|bb).* {
proxy_pass http://shsnc;
limit_req zone=reqzone burst=5;
limit_conn reqconn 10;
}
}
最终,通过截取jsessionid的值到达了限速的策略,也解决了内网用户通过统一出口IP访问业务相应影响的问题。
更多精彩干货分享
点击下方名片关注
IT那活儿
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/129886.html
摘要:在生产环境中,建议不要使用连接数限制单个连接的带宽限制不易过低像迅雷这种下载器的限速,可能需要别的办法注文中部分内容参考自关于的限速模块 nginx 限速研究汇报 写在前面 这两天服务器带宽爆了,情况如下图:showImg(https://segmentfault.com/img/bVUXj3?w=1884&h=352); 出于降低带宽峰值的原因,我开始各种疯狂的研究ng...
摘要:在生产环境中,建议不要使用连接数限制单个连接的带宽限制不易过低像迅雷这种下载器的限速,可能需要别的办法注文中部分内容参考自关于的限速模块 nginx 限速研究汇报 写在前面 这两天服务器带宽爆了,情况如下图:showImg(https://segmentfault.com/img/bVUXj3?w=1884&h=352); 出于降低带宽峰值的原因,我开始各种疯狂的研究ng...
摘要:作为一组独立的微服务之一被实现并作为一个单独的进行发布。该配置将暴露所有由网关发布的,入口位于,用协议加密保护。由网关发布的所有的所有后端服务均在中被定义。与浏览器不同,网关并不能向客户端发送带有新的命名的重定向。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,作者ArrayZoneYour Nginx往往是构建微服务中必不可缺的一部分,从本文中...
摘要:但是,你的连接数限制配置为允许单个连接数,单个连接数最大带宽为。就降低单个连接数带宽吧要知道大家谁没事会用浏览器自带下载器下载呢注本文只探讨限速模块在不同业务下的限速彩蛋偶尔发现,将连接数限制为迅雷不能高速下载了。 nginx 内置模块限速怎么使用就不多说了,今天来说说连接数和单个连接数限速的事。 场景:A公司有100人,A公司只有一个公网IP,假设A公司可能有100个人同时在下载你的...
摘要:但是,你的连接数限制配置为允许单个连接数,单个连接数最大带宽为。就降低单个连接数带宽吧要知道大家谁没事会用浏览器自带下载器下载呢注本文只探讨限速模块在不同业务下的限速彩蛋偶尔发现,将连接数限制为迅雷不能高速下载了。 nginx 内置模块限速怎么使用就不多说了,今天来说说连接数和单个连接数限速的事。 场景:A公司有100人,A公司只有一个公网IP,假设A公司可能有100个人同时在下载你的...
阅读 1249·2023-01-11 13:20
阅读 1557·2023-01-11 13:20
阅读 1011·2023-01-11 13:20
阅读 1680·2023-01-11 13:20
阅读 3971·2023-01-11 13:20
阅读 2519·2023-01-11 13:20
阅读 1310·2023-01-11 13:20
阅读 3486·2023-01-11 13:20