Nginx / 根据特定请求参数做限流

我们知道,在nginx的if中是不能写limit_req和limit_conn的。也就是说在nginx的配置文件中,我们无法通过if对请求参数做逻辑判断,从而实现对复杂请求参数的精准限流。

一、需求

针对某一个流量特别大的入口的某一个特定GET请求参数做限流,比如来自微信小程序的API请求入口(https://example.com/app/index.php?i=99&v=9.9.9&m=xxxx&from=wxapp),我希望from=wxapp时进行限流,若from不等于wxapp则不进行限流。

 

二、实现

在nginx的http部分写入:

limit_req_zone $paramFrom zone=from:10m rate=30r/s;
map $arg_from $paramFrom {
  wxapp wxapp;
}

这里的rate我设为了每秒处理30个请求,如果limit_req没有设置burst,则默认为0。

rate支持r/s和r/m两种模式。

 

在server部分写入:

location ^~ /app/index.php {
  limit_req zone=from;
  #limit_rate 512k;
  
  #宝塔PHP文件处理
  try_files $uri =404;
  fastcgi_pass unix:/tmp/php-cgi-56.sock;
  fastcgi_index index.php;
  include fastcgi.conf;
  include pathinfo.conf;
}

 

 

三、nginx的map模块

使用map模块,可以根据一个或多个变量组合成一个新的变量。通过判断新的变量,我们可以处理非常复杂的业务逻辑。本文是以map模块用于限流为示例,简单展示一下map的使用方法。

 

四、原理

http_limit_req_module和http_limit_conn_module两个模块是在 nginx 的 preaccess 阶段对请求做拦截,也就是说使用limit_req_zone或是limit_conn_zone对请求都是可以的。

但两者有本质上的区别,request和connection是不同的,在实际应用中应注意区别。

  • connection是连接,即常说的tcp连接,通过三次握手而建立的。
  • request是指请求,即http请求,(注意,tcp连接是有状态的,而构建在tcp之上的http却是无状态的协议)。

 

limit_req_zone或是limit_conn_zone对请求的限制有效性取决于 key 的设计,通常使用 realip 模块获取到的客户端 IP。但IP是针对全体用户做的限流,显然不能满足我们的需求。所以我们需要使用map模块来匹配特定的请求参数生成一个变量,将这个变量作为limit_req_zone或是limit_conn_zone的key,这样就可以实现我们的需求了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇