我们有一批分布式客户端,其中包括上传日志文件到我们的Apache服务器。
我们把一些日志上的日志轮转搞砸了,所以我们现在每天多次从这些客户端上传相对较大的文件。 显然,修正是让日志轮换工作,并把更多的智能客户,让他们停止这样做。 获取任何推送给客户的变更将需要几天,可能一两个星期。
与此同时,我们的3个T1通过这些上传完全饱和,许多重要的连接(比日志上传更重要)超时。
日志上传由在mod-wsgi下运行的Python脚本处理,我们试图通过(通过Python脚本)立即发送200成功。 这不起作用 – curl(我们用来做上传的)会在30秒后报告200和一个破损的pipe道,但是它仍然在上传这30秒。
有什么build议我们可以做些什么呢? 如果我们丢失了日志文件,我们并不太在意,但我们真的希望重要的stream量能够通过。
是否有可能改变您的DNS指向一个服务器(或负载平衡的服务器场),可以处理负载,和/或一个更好的networking连接的服务器,所以你不是在3T-1的瓶颈?
如果客户端连接的是IP地址,而不是DNS名称,那么您是否与您的上游提供商讨论了更改路由的问题,以便将相关IP地址路由到您的提供商或附近的服务器空间colo设施?
为什么不尝试没有Apache的另一种方式,如iptables。 如果它适合你的需要。
这里是一个好的开始。
刀具: http : //www.lowth.com/cutter/
Apache或客户端不会停止确切的第二。 因为连接已经build立。 即使你重新启动apache。 或阻止端口80上传位置。 它会等到超时结束。
但用刀具,你可以在一定的时间内停止连接。 这将在您所需的时间内为您提供足够的带宽/资源。 缩短你的连接。 超时在Apacheconfiguration保存内存和死/僵尸阿帕奇孩子。 然后用切刀杀死不必要的上传。
发送HTTP响应非常好,但您真正需要做的是closures连接。 我不熟悉mod_wsgi,但在mod_php中,例如,一个简单的:
exit(0);
在脚本的顶部工作就像一个魅力。 在调用脚本之前,您仍然(可能)读取input缓冲区的字节值,但这通常不是问题。
另一种select,因为你使用的是Apache,是阻止更高层次的东西; 添加一个新的GETstring到更新的客户端,然后添加一个configuration,如:
RewriteEngine on RewriteCond %{QUERY_STRING} !.*isNotBraindead=1.* RewriteRule path/to/python/script.py - [F,L]
根据另一个build议,是否有一个特定的DNS名称正在解决数据上传? 如果不用于其他任何事情,你可以试着简单地放下Alogging。
不知道您的networkingfunction是什么,但是您也可以考虑是否可以在上游部署ACL来阻止客户端stream量(假设传输此日志数据是他们唯一达到的目标)。 您也可以使用类似NBAR的东西来丢弃指向上传URL的stream量。 这些方法可以保留T线上有限的带宽,但不清楚你是否具有这种networking访问级别。
我对你的评论感到有点惊讶,即客户每天上传好几次,但是由于传输大约30秒,你在立即退出/返回200之后仍然被淹没。
在Apacheconfiguration中临时添加:
<Location /some/url/to/upload/handler> Deny from all </Location>
基本上,禁止访问用于上传处理程序的URL。
这假设完整的上传处理程序的URLpath不用于其他任何东西。
由于返回错误,即非200状态,Apache将立即断开连接。
我会考虑减慢路由器上的stream量,并让TCP / IP协议在速度上恢复。 例如,您可以使用tc对客户端服务器连接到日志服务器的端口80的速度实施限制。 如果将所有这些客户端可用的总速度限制为可用带宽的一半,那么您仍然可以使用该连接来处理剩余的stream量。
如果tc不可用或不适合,请查看任何其他工具以提供服务质量(QoS),这应该能够限制可用于特定问题的带宽。
我同意其他人的意见,遏制带宽是答案(不QoS路由 – 因为服务总是HTTP – 你只是想要一些客户端变慢)。
可能你可以用反向代理( 这里描述的鱿鱼安装程序),使用iptables或Apache的许多节stream模块之一( 在这里search带宽和您的Web服务器版本)。
你也许可以在没有任何重启/硬件/软件改变的情况下做iptables的事情,但是apache模块会给你非常好的控制哪些clinets / url来应用限制 – 尽pipe我不确定它们中有多less实际工作与上传。
HTH
C。