服务器负载相当大——每秒几百个请求。其中绝大多数是通过 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 秒)。
其他情况下将其关闭实际上是有用的。