apache2.4 debian 9 上的随机 CONNECTION_RESET

Man*_*tto 6 connection reset apache-2.4 debian-stretch

我的服务器有一些奇怪的行为,我只是找不到原因。我到处找。

我将向任何能解决这个问题的人支付价值 200 美元的比特币。

问题:

当从 apache 请求任何资源(页面、图片、css、js)时,有时需要很长时间才能响应。大约一半的时间,连接被重置。(在 Chrome 上:net::ERR_CONNECTION_RESET)这种情况很少发生,随机发生并且绝对不可预测。更令人困惑的是,虽然一个请求似乎挂起,但我可以提出其他完美运行的请求。

关于服务器:

我在 debian 9 上使用 php7.0 运行 apache2.4 mpm-prefork。apache 模块使用 mod_rewrite 和来自 certbot 的 ssl 证书。在某些情况下,php 调用inkscape 将svgs 呈现为png。

服务器负载非常低 (0.02),除了 apache 之外什么都没有运行。

检查的东西:

  • 检查所有服务器日志。(syslog, apache 日志) - 什么都没有
  • 增加了 apache mpm-prefork 限制 - 不
  • 检查可能的 DNS 问题 - 没有
  • 我什至搬到了一个全新的根服务器(在不同的提供者上)——还是一样

我继续使用 Wireshark 分析了 tcp 流量,发现了一些可疑的行为。当连接冻结时,会出现一些 TCP 乱序、重传和 ACK 看不见的分段数据包……但我没有必要的低级知识来判断发生了什么。

任何提示将大大appreaciated!

编辑:

这是 mpm_prefork 配置:

<IfModule mpm_prefork_module>
    StartServers            10
    MinSpareServers         10
    MaxSpareServers         50
    MaxRequestWorkers       300
    MaxConnectionsPerChild  0
</IfModule>
Run Code Online (Sandbox Code Playgroud)

编辑 编辑:

我很幸运,当它再次发生时,在服务器和客户端上都运行了一个 tcp 嗅探器。这是 pcap 文件,裁剪到最后大约 30 秒。

服务器端.pcap

客户端.pcap

如果有知识的人可以快速浏览一下并告诉我发生了什么,我会很激动。

编辑 编辑 编辑:

我设法使错误可重现,至少在 KeepAlive 上。当请求完成并提供内容时,tcp 连接将在 5 秒后以 FIN-ACK 关闭。在 FIN-ACK 后 5-12 秒的时间窗口内发出另一个请求时,连接冻结。

然而,随着 KeepAlive 关闭,这种情况不再发生,但在同时加载多个资源时,错误发生的频率更高。但后来它不再可复制了。

小智 1

我会检查服务器和客户端之间传输的 TCP 数据包的大小。如果它们的大小接近 1500,则它们有可能因多种可能性而被丢弃:

  1. 如果在数据包上设置了 DNF 位并且数据包在某处被分段,这可能是导致数据包丢失的问题

  2. 如果 MTU 设置为 1500 并且数据包正在通过隧道、加密等,这会导致向数据包添加额外的标头,那么这也会导致数据包丢失。尝试将您正在使用的接口两端的 MTU 设置为低于 1500、可能为 1420 甚至更低。