如何在apache中处理共享服务器上的带宽计费?

时间:2008-10-26 03:48:54

标签: linux apache sysadmin bandwidth

在apache的共享环境中,您有什么解决方案来处理vhost的带宽计费?如果您正在使用日志解析,那么当日志变得非常大时,您的解决方案是否可以很好地扩展?有人在那里使用任何类型的模块吗?

6 个答案:

答案 0 :(得分:1)

Apache 1.x和2.x存在某些模块,允许您在传输量上设置最大值,大多数模块使用Apache生成的记分板文件(当使用ExtendedStatus启用mod_status时)跟踪。我在寻找一个时仍然标记的那个是mod_curb,但它并不完整,并且在当前时刻看起来只能在服务器范围内工作,而不能用于单个虚拟主机。< / p>

Apache模块可以设置为出站过滤器,因此您可以编写一个位于链末端的服装模块,并将所有传出的数据包相加,使用APR提供的数据然后将其添加到该特定域/子域的计数器。之后,您可以选择如何处理数据。

有关具体示例,请查看Apache提供的mod_deflate,以查看它如何位于链的末尾并压缩除服务器发出的标头之外的所有内容。这应该会给你一个良好的开端。

对于基于日志的处理,存在的日志越多,速度就越慢。这只是野兽的本质。当我们使用基于日志的解决方案时,我们有一个每15分钟运行一次的自定义perl脚本。最终解析时间超过15分钟,因为我们在一段时间内正在运行这些日志处理perl脚本的多个时间之后才进行了正确锁定,所有这些脚本都在等待。我们最后用一个简单的调用tail -F来重新编写它,然后让perl解析每个请求,虽然不是完全有效,但是它有效。这样做的好处是我们现在能够近乎实时地更新流量统计数据,以便客户在超出限制时尽快更新。

答案 1 :(得分:1)

你可以去穷人的路线,并使用Webalizer或Awstats。这两种方法都可以让您了解基于访问日志的流量,并且可以基于每个虚拟主机完成。对于Awstats,我知道一旦你每天开始做10GB +的流量,就会开始消耗资源。你可以随时使用它,但是下周你将得到你的数据,而不是你真正需要的时候。在过去使用Webalizer时,我不得不使用一些hackery来处理大型访问日志,方法是将日志分成可以管理的较小部分。它没有提供我用它做的那么多有用的指标,但我也从来不需要从中保存服务器:)

答案 2 :(得分:1)

如果虚拟主机没有自己的IP,则没有比日志文件解析更简单的方法。只需使用mod_logio来计算传输的实际字节数。 mod_logio正确处理断开的连接,压缩数据等。您应该能够使用piped logs实时解析日志。使用BufferedLogs进一步缩放(只需检查解析器在正确缓冲时处理断行的行)。解析器应该定期(比如每分钟)保存数据,只是避免锁定问题,因为解析不能减慢httpd。如果httpd连接在服务器状态的L状态下花费时间,则速度太慢。有了数字后,您可以进一步求和,然后将数据保存到计费系统。

如果您还将结算日志保存为文件,则可以更正并双重检查实时流量计算。如果你启动httpd,你最终可能会错过一些行。但通常会丢失几百个请求,因为它在高容量网站上的价值不到几秒钟。

有些模块试图处理和限制带宽,比如mod_cband和mod_bw。但是当你在多台机器上使用相同的vhost时它们不起作用。我想他们会在较小的规模上正常工作。

如果您有每个vhost的IP,您可以尝试基于IP的方法,例如将防火墙日志提供给流量计算器。简单的方法是使用iptables

答案 3 :(得分:0)

虽然我们使用IIS而不是apache,但我们确实使用日志文件分析进行带宽计费(以及带宽分析/分析)。我们使用自定义应用程序以一小时为增量加载日志文件中收集的数据,并根据任何所需的通知或带宽过度使用。

日志文件加载程序作为低优先级进程运行,以便不中断服务器的操作。即使在拥有大量站点的高使用率服务器上,处理时间也不到15分钟,因此我们认为可扩展性不是这种方法的问题。

可能有更好的方法可以做到这一点,但这完全足以满足我们的需求。我期待着查看其他回复。

答案 4 :(得分:0)

使用mod_cband可以轻松实现。我们重写了模块以修复一些错误,在重启时提供真正的冗余并整合FTP和邮件统计信息。

http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling

答案 5 :(得分:0)

mod_cband很好,除了当我使用它时,max_connections(每个客户端的总体值,总值)组合,决定向上爬,直到达到我设置的最大值。当它达到最高值时,它只会停留在那里并让我的所有客户端收到一个“503 Service Temporarily Unavailable”错误。

例如,我设置了“CbandSpeed 1000Mbps 500 1200”,服务器连接在大约8小时内爬升到1200,然后停留在那里。此时,我在mod_cband状态窗口中计算远程客户端下的连接总数,我看到50左右。我也使用了ps aux,我看到大约相同数量(~50)的开放http进程,这是这是正常的,因为503错误导致任何人都无法访问该网站。

任何可能出错的想法,还是可以修复?