nginx利用内置模块配置限速限流

艺帆风顺 发布于 2025-04-03 14 次阅读


有时候 NGINX 面对一些特殊的场景时,需要进行一定的限速限流的配置,比如一个官网,可能前端静态文件是非常小的,但是同时配置的还有一些 apk 包,这些包如果不做任何限制,可能会形成比较大的负载或者带宽的压力,我这边碰到了,今天就来针对这个问题处理一下。

没有限制之前,对应的包下载速度如下:

添加如下配置,进行一定的限制:

http { ...#省略 limit_conn_zone $binary_remote_addr zone=addr:10m; ...#省略}server { listen 80 default; server_name localhost; location ~ "^/test/app/" { limit_conn addr 6; limit_rate_after 10m; limit_rate 1200k; limit_conn_status 499; limit_conn_log_level warn; root /app; }}

说明:

  • http 区域,我这里使用的是 1.15 版本的,默认已经安装了对应的模块ngx_http_limit_conn_module

    • limit_conn_zone:是一个固定的名称,下边调用的时候与之对应。

    • $binary_remote_addr:表示通过 remote_addr 这个标识来做限制,“binary_” 的目的是缩写内存占用量,是限制同一客户端 ip 地址。

    • zone=addr:10m:示生成一个大小为 10M,名字为 addr 的内存区域,用来存储访问的频次信息。

  • server 区域,可以直接写在 server 区域内,表示限制所有,也可以写到对应的 location 当中,以表示单独区域限制。

    • limit_conn:表示单个 IP 限制最大连接数为 6。

    • limit_rate_after:表示请求前 10m 大小时不限速。

    • limit_rate:表示单个连接最大连接带宽限制为 1200k。

    • limit_conn_status:设置拒绝请求的返回值。值只能设置 400 到 599 之间(默认是 503)。

    • limit_conn_log_level:定义日志级别,默认 error。

现在简单的做一下测试看看下载速度:

可以看到对应的速度已经收到限制,而且是在 10M 之后速度开始慢慢下降,直至达到限制的位置。现在可以简单压测看下情况:

$ ab -n 10 -c 10 http://www.test.com/res/app/app-xiaomi-release.apk

这条命令表示请求 10 次对应资源,并发为 10。监控对应日志,看到如下结果,因为我们定义的最大并发是 6,所以将会有 4 个失败,并返回 499 状态码,然后有 6 个成功。

$tailf -n 100 a |awk -F "," '{print $6}'"response": "499""response": "499""response": "499""response": "499""response": "200""response": "200""response": "200""response": "200""response": "200""response": "200"

另外在压测命令之后,还有一些输出可以参考:

Total transferred: 403483116 bytesHTML transferred: 403481400 bytesRequests per second: 0.18 [#/sec] (mean)Time per request: 56865.501 [ms] (mean)Time per request: 5686.550 [ms] (mean, across all concurrent requests)Transfer rate:          6929.10 [Kbytes/sec] received

其他的不说了,只看最后一条,可以看到总的对外输出是大约7M/s,正好符合单条限制 1.2M/s 乘以 6 的数值。

另外还有其他一些相关限制配置,有需要另行研究:研究地址。

版权声明:本文内容来自个人博客:二丫讲梵,遵循CC 4.0 BY-SA版权协议上原文接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行可。原文链接:https://wiki.eryajf.net/pages/3133.html如有涉及到侵权,请联系,将立即予以删除处理。在此特别鸣谢原作者:二丫讲梵的创作,Powered by 二丫讲梵。本文已获原作者授权发布。此篇文章的所有版权归原作者所有,与本公众号无关,商业转载建议请联系原作者,非商业转载请注明出处。