Limit bandwidth per-IP by value from HTTP Header
我有文件下载站点。我要寻找的是限制每个 IP 的带宽(!)。限制应由后端的 HTTP 标头动态设置。
我当前的实现使用 X-Accel-Limit-Rate(我可以更改该标头,它不会在任何地方进行硬编码),但它确实只限制当前的连接/请求。
我的想法在 G-Wan 中可行吗?
是的,这可以做到。
编写一个 G-WAN 处理程序以提取 X-Accel-Limit-Rate HTTP 标头。然后使用此处记录的 throttle_reply() G-WAN API 调用执行此策略。
一个名为 throttle.c 的可用示例可能会进一步帮助您。
throttle_reply() G-WAN 功能允许您在全局或每个连接上应用限制,因此您只需根据需要为 IP addresses 或 authenticated users 应用相关限制值。
throttle_reply() 可以在每个连接的生命周期内动态更改下载速度,因此您可以减慢旧连接并创建具有自适应下载速率的新连接。
当然,这可以在每个客户端 IP 地址(或 cookie,甚至 ISP/数据中心 AS 记录)上强制执行,以处理巨大的工作负载。
- 我知道throttle_reply() 但我不太了解/不知道如何限制每个 IP。我需要一些东西来防止文件下载器使用过多的带宽。我可以将单个连接限制为 10KB/s,但如果用户打开 10 个连接,他将使用 100KB/s。我的问题是如何动态地将所有这 10 个连接减慢到 1KB/s。
-
@Misiek其他下载站点应用的更简单的解决方案只是限制客户端可以建立的连接数。我认为我们可以使用 IP 目录:在 HDL_AFTER_ACCEPT 中记录客户端 IP(如果客户端 IP 已经存在于 IP 目录中,则拒绝连接),在 HDL_AFTER_WRITE 中将其删除。
-
我知道这更简单,但我只是在寻找限制每个 IP 的带宽。目前我每个 IP 有 2 个连接限制,但这又带来了另一个问题。现在用户不能从一个节点下载超过 2 个文件,因为他达到了连接限制。这就是我寻找每个 IP 带宽限制的原因 :)
-
@Misiek:throttle_reply() 可让您在每个连接的基础上动态限制,因此一旦打开多个连接,您就可以降低人们的下载速率:只需跟踪当前连接的 IP 地址并增加/减少连接计数器。然后,在使用 throttle_reply() 时,根据每个客户端的连接数划分每个客户端的带宽。这就是您正在寻找的按 IP 地址功能。
-
是否可以获得免费或付费示例?我不需要任何特别的东西,只需要工作脚本。我是在 nginx lua 中完成的,但在我看来,它的内存效率不高。
-
多久能收到他们的回复?
-
显然,没有那么长。要获得答案,发送电子邮件会有所帮助。我们的日志中没有这样的事情。尝试直接向 Pierre 发送电子邮件,而不是使用联系表(他的邮件地址与联系表在同一页面上)。
-
我在 23.06 上通过联系表格发送了消息。您应该检查它是否有效:) 稍后我将直接发送消息。
-
我们收到了您的消息,并收到了回复。
-
最后的评论问题。 G-Wan 团队会告诉我们如何使用非 C 语言的 G-Wan 的 API 吗?我不会从 Lua 设置throttle_reply,但它是空的(未定义的函数)。 API 是否只能从 C 中获得?我在这里问,因为我无法支持我 3 个月的收入价值......
-
C API 可用于作为模块加载的语言运行时(C、C、C#、D、Java、Objective-C、PH7 等),在 G-WAN 内存空间中执行它们的代码。其他语言作为 CGI、外部进程运行,因此必须使用自己的库,并且只能通过 CGI 变量与 G-WAN 通信。虽然 Lua 和其他一些语言理论上可以用作模块,但到目前为止没有人赞助开发。 [由于此回复"太长",我将其拆分为 2 条消息]。
-
G-WAN 支持 17 种语言,我们无法研究每种语言的 C 接口,其中大多数都没有良好的文档记录 - 并且在多线程环境中经常出现严重错误。
-
我不会为好的解决方案买单,但我现在从几个项目开始,我认为费用太大了。我只需要一个脚本,支付 140 欧元看起来就很多了。
-
然后找一个 C 开发人员来帮助您编写程序。 G-WAN 可以帮助所有用户,无论是否注册,但任何公司或任何顾问都不能免费为完全陌生的人编写自定义应用程序。而且,顺便说一句,瑞士法郎,而不是欧元(1 欧元 = 1.2 瑞士法郎)。