Ubuntu 服务器 12.04,apache2 - 第一个请求的响应非常慢

Ubuntu 服务器 12.04,apache2 - 第一个请求的响应非常慢

服务器负载相当大——每秒几百个请求。其中绝大多数是通过 SSL 进行的。

问题是,即使不涉及数据库,通过 HTTPS 向服务器发出的第一个请求响应速度非常慢(大约 10 秒)。接下来的请求在眨眼间就完成了。同时,没有 SSL 时,它一直运行得很快。几天前的情况正好相反 - 大多数流量在没有 SSL 时很快,没有 SSL 时很快,而有 SSL 时很慢。

我希望连接通过 SSL 进行,但经过大约 10 秒的活动后第一次响应是不可接受的。我可以在 apache2 配置中进行哪些更改以避免第一次响应缓慢?

答案1

听起来您在密钥交换上受到 CPU 限制。常见问题。当客户端首次通过 SSL/TLS 连接时,会进行(计算量非常大的)密钥交换。完成此密钥交换后,客户端可以在后续通信中重用在交换中获得的密钥。这就是为什么通过 HTTPS 发出的第一个请求需要很长时间才能完成的原因。

除了增加资源外,您几乎无能为力。更多的 CPU 将加快密钥交换的计算速度。更多的内存总是好的。您还可以配置 Apache 以将生成的密钥在内存中保留更长时间,以避免客户端重新进行密钥交换。

您还可以通过更改密码套件或调整密钥长度来稍微改善性能,但这通常不值得麻烦。

如果您要长时间承受这种负载,卸载 SSL/TLS 计算可能是个好主意。您可以获得一个单独的盒子(使用您最喜欢的代理)、SSL 加速卡,甚至是专门的 SSL/TLS 卸载盒。

答案2

看起来像是 DNS 问题。检查本地主机上的 DNS 是否配置正确并且运行正常,同时检查主机名查找在 apache 配置中指令设置为关闭。

答案3

我能想到的有两种情况:

  • 检查 Apache 的日志并从中找出一些巧妙的方法(错误、访问日志时间戳等)——我认为这是不太可能的
  • 或者:我建议你用 Wireshark 看看 SSL 握手协议是如何进行的。你应该看到 10 秒的时间流逝在服务器端还是客户端。我猜打开密钥库或类似的东西会花费很多时间,但首先你应该嗅探网络流量以获取时间戳。让我们知道进展如何!

答案4

我发现了一个问题。我不得不关闭 KeepAlive。

每秒都会有大量新连接(200-300/秒,有时更多)。其中大多数不需要连接保持活动状态 5 秒。因此,连接池很快就被利用了,所有新连接都必须等待旧连接在 5 秒后终止。

看来 KeepAlive 选项仅当服务器能够容纳足够的打开的连接,而大多数用户按照 KeepAliveTimeout 参数指定的时间执行某事时才有用(在我的情况下为 5 秒)。

其他情况下将其关闭实际上是有用的。

相关内容