netstat -ntp |grep 80
ESTABLISHED
显示来自单个 IP 地址的连接过多。其中大约300 个,这不是攻击,用户使用 2G 连接访问 Apache。其他 2G 连接也是如此。因此,Apache 的孩子用完了。
早些时候它显示太多close_wait
,启用后
tcp_tw_reuse
显示tcp_tw-recycle
不多close_wait
,但ESTABLISHED
连接数量增加了。
我们正在使用具有 48 GB 内存的 Ubuntu 11.04
keepalive On
keepalive timeout 10
max clients 800
max-request-perchild 4000
timeout 300
我已设置syn_ack
为 1 和syn_retries
2。
在wifi上没有这样的问题。连接正常关闭,但使用 2G 连接时,Apache 的子节点用完并且连接过多ESTABLISHED
。
我也试过将超时从默认的 300 设置为 30,但是由于我们的项目是手机图像托管,客户端无法正确上传图像,因为它们经常超时。还有很多408消息,所以将其更改为默认300
该问题与低速客户端有关。解决此问题的最佳方法是使用反向代理解决方案,例如 nginx、varnish 或类似的软件(如果来自 apache)。一个好的反向代理服务器可以毫无问题地处理数千个连接。
为什么将 Nginx 设置为反向代理是个好主意?
fin 超时在这里有帮助,但重用和回收?为什么?
这太愚蠢了。即使使用拨号,这也应该是 3 或更少。
你知道这是做什么的吗?这可能是默认值,但又太高了。
您可以尝试使用 wireshark 捕获一些流量,以准确了解连接未关闭的原因。
仅当客户严重崩溃并且您不介意为他们提供服务时。
它肯定会更容易地处理慢速连接,但是您可能想用作代理(并且您可以使用 iptables 通过它有选择地/透明地路由特定子网)
您是否尝试过将
Timeout
指令降低到更低的位置,例如10
or5
?或者,您可以尝试从 prefork MPM 切换(如果可能)并使用事件驱动模型,例如 Apache 2.4 中的事件 MPM 或不同的 Web 服务器,例如 nginx。
您还可以使用 nginx(或类似的)作为 Apache 前面的反向代理。代理将等到它收到整个请求,然后再向 Apache 发出上游请求。然后,此请求将不会在中间有任何延迟。
您的设置也可能导致或加剧 Apache 子级用尽的问题
Keepalive
。考虑关闭它或降低该keepalive timeout
值。当然,将其设置得太低可能会使它变得毫无用处。