Мы используем довольно мощный выделенный сервер с процессором Xeon, 32 ГБ ОЗУ и твердотельными накопителями RAID под управлением Centos 6. Тем не менее, мы все еще наблюдаем, как HTTPS увеличивает время загрузки нашей страницы более чем на 100 мс. Что мы можем сделать, чтобы увеличить скорость даже на 20 мс?
Вот настройки Apache:
SSLHonorCipherOrder on
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-EC$
SSLProxyCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECD$
SSLProtocol all -SSLv3 -SSLv2
SSLProxyProtocol all -SSLv3 -SSLv2
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/var/run/ssl_scache(5120000)"
SSLSessionCacheTimeout 300
SSLUseStapling On
SSLStaplingCache "shmcb:/var/run/ssl_stapling(128000)"
SSLStaplingReturnResponderErrors off
SSLStaplingStandardCacheTimeout 3600
SSLStaplingErrorCacheTimeout 600
SSLStaplingResponderTimeout 5
HTTPS действительно замедляет работу вашего сайта, несмотря на все утверждения об обратном. Это связано с тем, что клиент и сервер должны согласовать шифры SSL / TLS перед запуском. тем не мение после что для большинства сайтов замедление незначительно, а SSL дает огромные преимущества.
Кроме того, по умолчанию используется http, поэтому кому-то, кто вводит его для сайта, поддерживающего только https, потребуется перенаправление на версию https, что приведет к другому круговому пути.
На самом деле 100 мс - это не так уж и плохо, что замедление для начального соединения, и, как я уже сказал, после этого соединение будет установлено, поэтому замедления не будет. Итак, во-первых, хотя начальная скорость соединения важна, просмотр сайта также очень важен, и здесь вы не должны зависеть от замедления на 100 мс.
Ваша конфигурация SSL / TLS на самом деле выглядит довольно хорошо как с точки зрения безопасности, так и с точки зрения производительности. Вы используете современные и быстрые шифры и комплекты (хотя ваш комплект шифров очень ограничен только для новых браузеров, и если это сделано намеренно, вы также можете отключить TLSv1 и TLSv1.1), настроить SSL-кеширование (для сохранения клиентов повторное согласование сеанса SSL для каждого соединения) и настройка SSL Stapling (чтобы клиент не мог выполнять дополнительный поиск для проверки действительности вашего сертификата).
Однако некоторые вещи, которые я могу предложить, приведены ниже. Это может уменьшить влияние использования https, но не уменьшит начальную задержку соединения 100 мс:
Убедитесь, что Keep-Alives включены для сервера (должно быть по умолчанию, но лучше дважды проверить). Вы должны убедиться, что делаете не см. в ответе заголовок «Соединение: закрыть». Без Keep-Alives ваш SSLCache бессмысленен.
Увеличьте значение SSLSessionCacheTimeout с 300 секунд до 5 минут. Если вы находитесь на вашем сайте и просматриваете его, вы можете легко выйти за пределы этого. Вы уже ограничили размер вашего SSLSessionCache, так что нет ничего плохого в увеличении этого тайм-аута до большего.
Внедрите HSTS, чтобы сообщить браузеру, что ваш сайт всегда предпочитает https (даже если пользователь не вводит протокол в адресной строке своего браузера или даже если он вводит http). Это сохранит первоначальное перенаправление.
HTTP / 2 поможет со скоростью https-соединения, поскольку вы, не одинокий, используете для этого параллельные соединения, но, что более важно, повысит производительность другими способами. Тем не менее, он все еще экспериментальный для Apache (хотя мне кажется достаточно стабильным).
Я бы также посоветовал вам регулярно запускать свой сервер через https://www.ssllabs.com/ssltest/index.html чтобы протестировать вашу конфигурацию SSL / TLS, поскольку все в этом пространстве постоянно меняется по мере обнаружения новых уязвимостей.
Вы можете включить HTTP / 2, что уменьшит количество подключений для совместимых браузеров, уменьшив время загрузки страницы. Однако это не уменьшит задержку для этого соединения. Демо Вот.
Смотрите также этот вопрос - задержка является ключевым моментом в этой ситуации. Я проверил скорость своего https-сервера в Сиднее, Австралия. При тестировании с другого сервера в Сиднее время установления связи SSL составляет 46 мс, для EC2 в США - 213 мс. Разница заключается в продолжительности передачи пакетов туда и обратно, а также в некоторых неизбежных накладных расходах, даже если задержка равна нулю. Я не знаю, что такое обязательная задержка, но вы, вероятно, могли бы решить ее экспериментальным путем.
Вы проводили тестирование с помощью клиента, расположенного близко к вашему серверу или далеко - что за пинг? Еще одна полезная страница вокруг рукопожатия https. 100 мс, вероятно, не так уж и плохи, как накладные расходы для https.
Кто-то может порекомендовать некоторые настройки Apache. Если вы разместите ссылку на свой веб-сайт, кто-нибудь сможет ее посмотреть.
Это не лучший ответ, но если вы хотите узнать, как работает SSL, прежде чем оптимизировать его, вот контрольный список для быстрого HTTPS:
Все мои знания, связанные с сервером, опубликованы в этом репозитории. https://github.com/szepeviktor/debian-server-tools
Всего наилучшего!