Сервер очень загружен - несколько сотен запросов в секунду. Подавляющее большинство из них осуществляется через SSL.
Проблема в том, что первый запрос через HTTPS к серверу встречает очень медленный ответ (например, 10 секунд), даже если база данных не задействована. Следующие запросы реализуются в мгновение ока. В то же время без SSL он работает постоянно быстро. Несколько дней назад ситуация была обратной - большая часть трафика была без SSL, тогда он был быстрым без SSL, а с SSL медленным.
Я хочу, чтобы соединения проходили через SSL, но первый ответ после некоторого времени отсутствия активности на уровне около 10 секунд недопустим. Что я могу изменить в конфигурации apache2, чтобы избежать первого медленного ответа?
Я могу придумать два сценария:
Похоже, проблема с DNS. Убедитесь, что DNS настроен на localhost и работает правильно, также проверьте Имя хоста директива отключена в конфигурации apache.
Похоже, вы ограничены процессором при обмене ключами. Общая проблема. Когда клиент подключается через SSL / TLS в первый раз, производится обмен ключами (очень затратный в вычислительном отношении). После завершения этого обмена ключами клиенты могут повторно использовать ключи, полученные при обмене, в следующем сеансе связи. Вот почему первый запрос по HTTPS занимает так много времени.
В этой ситуации вы мало что можете сделать, кроме как добавить ресурсы. Больше ЦП ускорит расчеты обмена ключами. Больше памяти - это всегда хорошо. Вы также можете настроить Apache так, чтобы сгенерированные ключи оставались в памяти дольше, чтобы клиенты не повторяли обмен ключами.
Вы также можете немного улучшить производительность, изменив шифровальные костюмы или настроив длину ключей, но обычно это не стоит хлопот.
Если вы собираетесь работать с такой нагрузкой в течение более длительного времени, может быть хорошей идеей разгрузить вычисления SSL / TLS. Вы можете получить отдельный ящик (используя ваш любимый прокси), карту ускорения SSL или даже специализированный ящик разгрузки SSL / TLS.
Я обнаружил проблему. Пришлось отключить KeepAlive.
Каждую секунду было много новых подключений (200-300 / с, иногда и больше). Большинству из них не требовалось поддерживать соединение в течение 5 секунд. В результате пул соединений был быстро использован, и все новые соединения должны были ждать завершения старого после 5 секунд.
Похоже, что опция KeepAlive полезна только тогда, когда сервер может удерживать достаточно открытых соединений, в то время как большинство пользователей делают что-то для указанного параметром KeepAliveTimeout (например, 5s в моем случае).
В другом случае действительно полезно выключить.