在Apache中,来自单个IP地址的ESTABLISHED连接过多

netstat -ntp |grep 80显示来自单个IP地址的ESTABLISHED连接太多。 其中约300人,这不是一个攻击 ,用户使用2G连接访问Apache。 其他2G连接也是如此。 由于这个Apache正在耗尽儿童。

早些时候,它显示了太多的close_wait并且在启用tcp_tw_reusetcp_tw-recycle之后,没有太多的close_wait但是增加了ESTABLISHED连接的数量。

我们使用的是具有48 GB RAM的Ubuntu 11.04

 keepalive On keepalive timeout 10 max clients 800 max-request-perchild 4000 timeout 300 

我已经将syn_ack设置为1, syn_retries为2。

在WiFi上没有这样的问题。 连接正常closures,但使用2G连接,Apache正在耗尽儿童和许多ESTABLISHED连接。

我也尝试了从默认300到30设置超时 ,但由于我们的项目是手机图像托pipe,客户端无法正确上传图像,因为他们正在越来越频繁的时间。此外还有大量的408消息,所以改变它默认300

tcp_tw_reuse和tcp_tw-recycle,tcp-fin_timeout为30

鳍超时帮助在这里,但重用和reccyle? 为什么?

保持活动超时10

这是愚蠢的。 即使拨号,这应该是3或更less。

超时300

你知道这是什么吗? 这可能是默认的,但它又太高了。

你可以尝试捕捉一些使用wireshark的stream量来查看连接为什么没有closures。

正在使用mod_reqtimeout一个选项

只有当客户非常糟糕,而且您不会为提供服务而烦恼。

我们应该移动到Ngnix服务器

它肯定会更容易地处理慢速连接,但是您可能希望将其用作代理(并且可以使用iptables通过此select性/透明地路由特定的子网)

问题与低速客户端有关。 解决这个问题的最好办法是使用反向代理解决scheme,例如nginx,varnish或类似的软件,如果你的apache。 一个好的反向代理服务器可以处理成千上万的连接,

为什么把Nginx设置为反向代理是一个好主意?

你有没有试过把Timeout指令放到更低的地方,例如105

或者,您可以尝试从prefork MPM(如果可能)切换,并使用事件驱动模型,如Apache 2.4中的事件MPM或不同的Web服务器(如nginx)。

你也可以在Apache之前使用nginx(或类似的)作为反向代理。 在向Apache发送上游请求之前,代理将等待直到收到完整的请求。 这个请求在中间不会有任何延迟。

Apache儿童用完的问题也可能由Keepalive设置引起或加剧。 考虑closures此function或降低保keepalive timeout值。 当然,把它做得太低可能会使它变得毫无用处。