[alibaba/tengine]流量防刷

2024-02-21 465 views
4

版本信息 [root@master nginx]# nginx -v Tengine version: Tengine/2.3.1 nginx version: nginx/1.16.0

主要是用于做负载均衡这块 upstream game_test { consistent_hash $request_uri; server 10.241.106.94:8080 id=1001; check interval=5000 rise=2 fall=3 timeout=10000 type=http port=8080; check_http_send "HEAD /pocket-creature-backend/run HTTP/1.0\r\n\r\n\r\n"; check_http_expect_alive http_2xx

配置 limit_req_zone $binary_remote_addr zone=one:30m rate=6r/s; limit_req_zone $binary_remote_addr $uri zone=two:30m rate=5r/s; limit_req_zone $binary_remote_addr $request_uri zone=three:30m rate=5r/s; limit_req_status 444; 引用到负载均衡上了。 limit_req zone=two;

输出日志 183.48.126.88 [14/Sep/2019:22:49:56 444 "POST /pocket-creature-backend/user/updateStoryPieces 183.48.126.88 [14/Sep/2019:22:49:56 444 "POST /pocket-creature-backend/user/checkTimelimitPackage 183.48.126.88 [14/Sep/2019:22:49:56 444 "POST /pocket-creature-backend/user/updateStoryPieces 183.48.126.88 [14/Sep/2019:22:49:56 200 "POST /pocket-creature-backend/user/updateStoryPieces 问题反馈: 相同的ip地址并且访问相同的url 限流没有起到作用,只是对同一个IP地址有作用

回答

1

问题: limit_req_zone $binary_remote_addr$request_uri zone=three:30m rate=1r/s; 同一个IP+url 可以生效,但是当有2个客同一个IP请求相同的URL的时候就开始屏蔽了,$request_uri,是针对相同的url不同的参数

访问日志url 参数为空 [16/Sep/2019:11:10:26 200 "POST /pocket-creature-backend/chat/getLatest

问题:能否在POST方法,也可以对ip+url和url不同的参数做处理呢?

4

访问日志POST url 参数为空 [16/Sep/2019:11:10:26 200 "POST /pocket-creature-backend/chat/getLatesty 因为post方法的参数隐藏了,

问题: limit_req_zone 是否可以对POST 的URL不同的参数也做限制吖

1

@webnginx886 $request_uri变量是可以打印出请求参数的(前提是你的请求参数是存在的),日志里面没有打印,应该是使用的$uri这个参数吧。

9

log_format main '$remote_addr - $remote_user [$time_local] "$request_uri $request_body"' ' $status $body_bytes_sent "$http_referer" ' '"$http_user_agent"' ;

日志

183.48.125.232 - - [16/Sep/2019:12:58:22 +0800] "/pocket-creature-backend/chat/getLatest channel=1&tribeId=0&userId=10010000386232&deviceUUID=&version=v91.0219_91.2.30&inBattle=false&lol=bfcf3504ae1e1b4eab0c4cc2c24f6295" 200 2047 "http://192.168.10.200/dev/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0"

都不可以,但是请求参数是在的,我在日志定义格式的时候加了$request_body可以把参数打印出来,但是不能把URL打印出来,

4

那问题的关键是你把所谓上文讨论的请求参数是放在body里面的,那可以把对应的key设置为:$binary_remote_addr$request_uri$request_body

9

再次测试: 改为: limit_req_zone $binary_remote_addr$request_uri$request_body zone=three:30m rate=1r/s;

打印日志 183.48.125.234 - - [16/Sep/2019:13:30:07 +0800] "/pocket-creature-backend/chat/getLatest channe l=1&tribeId=0&userId=10010000386236&deviceUUID=&version=v91.0219_91.2.30&inBattle=true&lol=61fa7 e2effd3bb5f420dfe8e7fd58465" 200 2048 "http://192.168.10.200/dev/" "Mozilla/5.0 (Windows NT 10.0 ; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0" 183.48.125.234 - - [16/Sep/2019:13:30:07 +0800] "/pocket-creature-backend/chat/getLatest -" 444 0 "-" "%E5%BD%B1%E5%AD%90%E6%9C%8D2/5 CFNetwork/978.0.7 Darwin/18.7.0"

第二条被屏蔽限制了。看来$binary_remote_addr$request_uri$request_body没有完全起作用 是否支持多个变量,$request_body也是否支持。

7

@webnginx886 限流这块具体参考文档 http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone

是否起作用,要看你设置的变量是否有值。从上面的日志中很明显看出来对应的第2个请求的request_body没有值。另外限流KEY设置为$binary_remote_addr$request_uri$request_body是表示使用这三个值的组合作为KEY进行计数的。