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

你有什么解决scheme来处理您的虚拟主机共享环境中的虚拟主机的带宽计费? 如果您使用日志分析,日志变得非常大时您的解决scheme是否可以很好地扩展? 任何人在这里使用任何types的模块?

对于Apache 1.x和2.x,有一些模块允许您设置最大的传输量,其中大部分使用Apache生成的记分板文件(当mod_status启用ExtendedStatus时)跟踪。 从我找的时候,我仍然有一个书签是mod_curb ,但是它不是完整的,在当前的时间看起来只能在服务器范围内工作,而不是在单个虚拟主机上工作。

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

对于具体的例子,看看Apache提供的mod_deflate,看看它是如何在链的末尾,压缩除了服务器发出的头之外的所有东西。 这应该给你一个好的开始。

至于基于日志的处理,日志存在的越多越慢。 这只是野兽的本质。 当我们使用基于日志的解决方案时,我们有一个自定义的perl脚本,每15分钟运行一次。 最终解析需要15分钟以上的时间,而且由于我们已经锁定了一段时间,所以这些日志处理中的多个脚本现在正在运行,所有这些脚本都在等待着彼此。 我们最后重新写了一个简单的调用tail -F,然后让perl解析每一个请求,而不是完全有效的,它的工作。 这样做的好处是,我们现在能够近实时地更新流量统计数据,以便客户在超出限制时尽早更新,而不是稍后更新。

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

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

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

有模块试图处理和限制带宽,如mod_cband和mod_bw。 但是当你在多台机器上有相同的虚拟主机时,它们不能工作。 我想他们会在较小的范围内工作。

如果你有每个虚拟主机的IP地址,你可以尝试使用基于IP的方法,比如将防火墙日志提供给流量计算器 简单的方法是使用iptables 。

尽管我们使用IIS而不是apache,但是我们使用日志文件分析来进行带宽计费(和带宽分析/分析)。 我们使用自定义应用程序以一小时为单位加载日志文件中收集的数据,并根据需要进行通知或带宽过度使用。

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

这样做可能有更好的方法,但这对于我们所需要的是完全足够的。 我期待看到其他答复。

用mod_cband很容易实现。 我们重写了这个模块来修复一些错误,在重启时提供真正的冗余,并且包含FTP和Mail统计信息。

http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling

那么mod_cband将是伟大的,除了当我使用它,max_connections(总的,每个客户端的总价值加起来),决定爬行,直到它达到我设定的最大值。 当它达到最高价值,它只是停留在那里,并留下所有我的客户端收到一个恒定的“503服务暂时不可用”的错误。

例如,我设置了“CbandSpeed 1000Mbps 500 1200”,服务器连接大约在8小时内爬到1200,然后停留在那里。 在这一点上,我计算了远程客户端在mod_cband状态窗口下的连接总数,我看到了50左右。我也使用ps aux和我看到了相同的数量(约50)打开http进程,这是正常,除了由于503错误而没有人可以访问网站的事实。

任何想法可能是错误的,或者可以解决这个问题吗?