0

0

怎么限制单个IP连接数_自定义连接计数器实现方法【方法】

蓮花仙者

蓮花仙者

发布时间:2026-03-17 20:30:12

|

473人浏览过

|

来源于php中文网

原创

生产环境首选 nginx 内置 limit_conn 限制 IP 并发连接数,它开箱即用、无依赖、不阻塞 worker;需用 $binary_remote_addr 定义 zone,不可与限请求频率的 limit_req 混用。

怎么限制单个ip连接数_自定义连接计数器实现方法【方法】

nginx 里用 limit_conn 做 IP 连接数限制最稳

直接上结论:生产环境首选 limit_conn,不是靠写 Lua 或改内核参数硬扛。它由 nginx 内置模块 ngx_http_limit_conn_module 实现,开箱即用、无额外依赖、不阻塞 worker 进程。

常见错误是把 limit_connlimit_req 混用——后者限的是请求频率(QPS),前者才真正限制并发 TCP 连接数。比如一个长轮询接口被单个 IP 建了 200 个连接,limit_req 完全不管,只有 limit_conn 能拦住。

  • limit_conn_zone $binary_remote_addr zone=perip:10m:必须用 $binary_remote_addr(不是 $remote_addr),节省内存且支持 IPv6;10m 足够存约 16 万个 IP 计数器
  • limit_conn perip 10:放在 serverlocation 块里,表示每个 IP 最多 10 个并发连接
  • 注意作用域:limit_conn 不支持在 if 中使用,也不能嵌套生效;如果想对某些路径放行,得用 limit_conn off 显式关闭

为什么不用 openresty 的 lua-resty-limit-traffic

它灵活,但真没必要为单纯限连接数引入 Lua。实际踩过的坑包括:

  • 计数器默认存在 shared dict,但 dict 大小没配够时,新连接会静默 fallback 到不计数(现象是限流完全失效)
  • 在 keepalive 场景下,同一个 socket 复用多次请求,Lua 计数器可能重复累加或漏减,需要手动管理 connection 生命周期
  • worker 间共享状态依赖 lua_shared_dict,而它的内存分配是预分配的,扩容需 reload,不如 nginx 原生命令直观

除非你要做动态阈值(比如根据上游负载实时调连接上限),否则纯 Lua 方案只是把简单问题复杂化。

Post AI
Post AI

博客文章AI生成器

下载

iptables 只能当临时补丁,别当主力

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 32 -j REJECT 确实能拦,但它工作在网络层,没法区分 HTTP 层的虚拟主机或 path,更没法和 nginx 日志联动。

  • 一旦触发,连接直接被 kernel 丢弃,客户端收不到 503,只看到 Connection refused 或 timeout,排查困难
  • --connlimit-mask 32 对 IPv4 是单 IP,但 IPv6 下 /64 才是合理粒度,硬写 128 会崩掉整个模块
  • 规则生效后无法按域名、location 或 upstream 分组限流,灵活性归零

自定义计数器真要写,就用 redis + incrby + expire

如果业务逻辑特殊(比如“同一账号下所有设备 IP 总连接数 ≤ 5”),nginx 原生搞不定,就得自己记。这时候 redis 是唯一靠谱选择——memcached 不支持原子 incr + expire 合并操作,本地文件或内存变量跨 worker 不一致。

  • key 设计用 conn:ip:{ip}conn:uid:{uid},避免 key 冲突
  • 务必用 INCRBY key 1 + EXPIRE key 60 组合,不能先 GET 再 SET,否则并发时计数错位
  • 超限时返回 503 Service Temporarily Unavailable,别用 429,因为 429 是给 rate limit 用的,语义不符

真正难的不是写这几行代码,而是 redis 故障时的降级策略——比如是否允许缓存击穿后放过连接,还是宁可拒绝也不让服务雪崩。这个决策点,文档里从来不会写。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.07.27

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

522

2023.08.04

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

611

2023.08.04

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

245

2024.02.23

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

740

2024.07.09

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

3619

2024.08.07

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

60

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

74

2026.01.13

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

17

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号