如何实现限制某个文件单 IP 一小时只能下载 3 次?

2022-12-22 13:46:05 +08:00
 edis0n0

一个客户端更新原理是获取 http://example.com/latest.txt 里的数字版本号,如果大于当前版本号就后台下载 http://example.com/latest.exe ,如果下载失败就一直不停循环下载,多几个客户端循环下载服务器带宽就满了,需要实现限制这个文件单 IP 一小时只能下载 3 次,最方便的实现方法是什么?(不能用跳转,因为垃圾客户端不会追踪跳到哪里)

最好能用服务器上有的 php+Apache ,因为服务器的系统是 CentOS4.8 ,所有东西基本都要自己编译了不说,它的 uptime 快 9 年了,我很怕因为什么关机就起不来了。

不能读日志直接封 IP ,因为同域名下有很多 API ,旧版客户端也能用。

3245 次点击
所在节点    程序员
26 条回复
zzzzzzy
2022-12-22 14:24:35 +08:00
netty 限制每个客户端下载带宽
edis0n0
2022-12-22 14:25:54 +08:00
@zzzzzzy #1 服务器上没 java ,而且是 uptime 快 9 年的 centos4.8 我不敢装人家
edis0n0
2022-12-22 14:26:04 +08:00
@edis0n0 人家->软件
CodeSorcerer
2022-12-22 14:26:30 +08:00
apache 的 qos 模块? https://mod-qos.sourceforge.net/
XiLingHost
2022-12-22 14:26:57 +08:00
@edis0n0 java 不需要安装啊,你可以单独给个目录
edis0n0
2022-12-22 14:31:06 +08:00
@dailixin359 #4 刚看了下服务器上的是 Nginx 不是 Apache ,另外这个看起来是直接限速,不能限制一段时间内的下载次数
PerFectTime
2022-12-22 14:33:53 +08:00
提供一个思路,加一台服务器放在前面用你想用的软件和编译的东西
Lax
2022-12-22 15:15:45 +08:00
nginx rate limit 可以搞。但是你这个周期偏长了,要考虑这个 location 的请求量,周期内请求量越多,会消耗越多的内存来保存限流状态。
https://nginx.org/en/docs/http/ngx_http_limit_req_module.html
GeorgeWai
2022-12-22 16:08:28 +08:00
考虑用 iptables 试试
nekoneko
2022-12-22 17:15:37 +08:00
写个 nginx 插件?
写个服务把现在的下载接管了, 在服务里面加逻辑?
Jirajine
2022-12-22 17:47:02 +08:00
那就直接用 php 接管那两个路由,自己实现判断逻辑
edis0n0
2022-12-22 17:57:24 +08:00
@Jirajine #10 不会 php ,这十几年前写的系统每个 php 都是一个入口不懂怎么加这种路由
FrankAdler
2022-12-22 21:21:06 +08:00
用你能解决的方式实现,然后把这部分流量转发过去(用你能做到的方式)
Jirajine
2022-12-22 22:41:03 +08:00
@edis0n0 nginx/Apache 加个 rewrite 规则,或者弄个 latest.exe.php 这样的 filesystem based route ,具体看 cgi 怎么配的。
yoloMiss
2022-12-22 23:38:15 +08:00
我理解你这个是否下载的判断是做在客户端的啊,那为什么不把这个单个小时内的下载次数限制也做在客户端呢?
edis0n0
2022-12-22 23:53:31 +08:00
@yoloMiss #14 有没可能客户端已经十年没发过更新了,大部分用户都在用旧版?
zhensjoke
2022-12-23 09:58:37 +08:00
有没有可能把 latest.exe 改为一个语言脚本,比如 php ,
然后在里边写代码判断请求 IP 的,符合条件的返回 exe 数据流。
zhensjoke
2022-12-23 10:09:19 +08:00
配置 nginx 将*.exe 的请求交给 php 处理,
V1Eerie
2022-12-23 20:10:02 +08:00
可以使用 nginx 的 limit_req 模块来实现每小时的限制下载。
limit_req_zone $binary_remote_addr zone=one:10m rate=3r/h; 这将限制每个 IP 地址每小时进行 2=3 次下载请求。
参考链接: http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
可以自己在调整一下参数。
jones2000
2022-12-24 00:09:49 +08:00
把升级包放到 CDN 上不就行了, 能用钱解决的事,不要用代码解决。回头 PPT 上写上使用分布式升级,高大上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/904109

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX