您有哪些解决方案可以在 apache 的共享环境中为您的虚拟主机处理带宽计费?如果您使用日志解析,当日志变得非常大时,您的解决方案是否可以很好地扩展?有人为此使用任何类型的模块吗?
6 回答
Apache 1.x 和 2.x 存在某些模块,它们允许您设置传输量的最大值,其中大多数使用 Apache 生成的记分板文件进行跟踪(当 mod_status 启用并启用 ExtendedStatus 时)。我在寻找时仍然收藏的一个是mod_curb,但它并不完整,目前看来只能在服务器范围内工作,而不适用于单个虚拟主机。
Apache 模块可以设置为出站过滤器,因此您可以编写一个位于链末端的装扮模块,并使用 APR 提供的数据将所有传出数据包相加,然后将其添加到计数器中那个特定的域/子域。之后,您可以选择如何处理数据。
对于具体示例,请查看 Apache 提供的 mod_deflate,了解它如何位于链的末端并压缩除服务器发送的标头之外的所有内容。这应该给你一个好的开始。
至于基于日志的处理,存在的日志越多,它的速度就越慢。这只是野兽的本性。当我们使用基于日志的解决方案时,我们有一个每 15 分钟运行一次的自定义 perl 脚本。最终解析需要超过 15 分钟,而且由于我们在一段时间后有适当的锁定,这些日志处理 perl 脚本中的多个现在正在运行,所有这些都在相互等待。我们最终通过一个简单的 tail -F 调用重写了它,然后让 perl 解析每一个进来的请求,虽然效率不高,但它确实有效。这样做的好处是,我们现在能够近乎实时地更新流量统计数据,以便客户端在超出限制时尽快更新。
你可以走穷人的路线,使用 Webalizer 或 Awstats。这两个都可以让您了解基于访问日志的流量,并且可以在每个虚拟主机的基础上完成。就 Awstats 而言,我知道一旦你开始每天处理 10GB 以上的流量,它就会开始消耗资源。你总是可以很好的,但是你会在下周得到你的数据,而不是在你真正需要的时候。在过去使用 Webalizer 时,我不得不使用一些骇客来让它处理大型访问日志,方法是将日志分块成它可以管理的更小的部分。它没有提供与我所做的一样多的有用指标,但我也从来不需要从中保存服务器:)
如果虚拟主机没有自己的IP,没有比解析日志文件更简单的方法了。只需使用mod_logio来计算实际传输的字节数。mod_logio 正确处理断开的连接、压缩数据等。您应该能够使用管道日志实时解析日志。使用BufferedLogs进一步扩展(只需检查解析器在正确缓冲时是否处理断行)。解析器应该定期(比如每分钟)在某处保存数据,只是避免锁定问题,因为解析不能减慢 httpd 的速度。如果 httpd 连接在服务器状态下花费时间处于 L 状态,那么您太慢了。获得数字后,您可以进一步求和,然后将数据保存到计费系统。
如果您也将计费日志另存为文件,您可以更正并仔细检查实时流量计算。如果您启动 httpd,您最终可能会丢失一些行。但通常丢失几百个请求是可以接受的,因为它在高容量站点上的价值不到几秒钟。
有些模块会尝试处理和限制带宽,例如 mod_cband 和 mod_bw。但是当您在多台机器上拥有相同的虚拟主机时,它们就不起作用了。我想他们会在较小的规模上正常工作。
如果每个虚拟主机都有 IP,则可以尝试基于 IP 的方法,例如将防火墙日志提供给流量计算器。简单的方法是使用iptables。
虽然我们使用 IIS 而不是 apache,但我们确实使用日志文件分析来进行带宽计费(和带宽分析/分析)。我们使用自定义应用程序以一小时为增量加载日志文件中收集的数据,并根据任何所需的通知或带宽过度使用采取行动。
日志文件加载器作为低优先级进程运行,以免中断服务器的操作。即使在具有大量站点的高使用率服务器上,处理时间也不到 15 分钟,因此我们不认为这种方法的可扩展性是一个问题。
可能有更好的方法可以做到这一点,但这完全可以满足我们的需要。我期待着查看其他回复。
那么 mod_cband 会很棒,除了当我使用它时,max_connections(每个客户端组合的整体总值)决定向上爬行,直到它达到我设置的最大值。当它确实达到最高值时,它只会停留在那里,让我的所有客户都收到一个恒定的“503 服务暂时不可用”错误。
例如,我设置“CbandSpeed 1000Mbps 500 1200”,服务器连接在大约 8 小时内爬升到 1200,然后停留在那里。此时,我在 mod_cband 状态窗口中计算远程客户端下的连接总数,我看到大约 50 个。我还使用了 ps aux,我看到大约相同数量(~50)的打开 http 进程,即正常,除了由于 503 错误,根本没有人可以访问该站点。
有什么想法可能是错的,或者可以解决这个问题吗?
使用 mod_cband 可以轻松实现。我们重写了模块以修复一些错误,在重新启动时提供真正的冗余并合并 FTP 和邮件统计信息。
http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling