Назад | Перейти на главную страницу

Повышение производительности SSL с помощью Nginx

У нас есть Nginx в передней части нашей системы и мы прокси для Apache в задней части. Мы используем SSL / TLS для нашего соединения.

Вопрос:

  1. Является ли Nginx лучшим вариантом для завершения соединений SSL / TLS с точки зрения производительности / SSL-рукопожатия?
  2. Я делаю все необходимые настройки производительности? Могу ли я улучшить свой код?

Вот мой конфиг:

ssl_certificate /path/ssl.crt; 
ssl_certificate_key /path/ssl.key;
ssl_dhparam /path/dh.pem;
ssl_buffer_size 4k;
ssl_session_timeout 4h;
ssl_session_cache shared:SSL:20m;
ssl_session_tickets on;
ssl_trusted_certificate /path/trust.crt;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

я использую Генератор конфигурации Mozilla SSL чтобы сгенерировать мои шифры ниже.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

Шифр должен был соответствовать большинству браузеров. у меня тоже есть Строгая транспортная безопасность устанавливать.

Наша система работает на Amazon AWS с CloudFront. В настоящее время SSL Labs запускает тест примерно за 130 секунд. И Pingdom показывает SSL-соединение для одного запроса занимает не менее 220 мс.

Спасибо!

У меня были проблемы с производительностью в nginx и incapsula, и я обнаружил, что проблема связана с используемым шифром. Инкапсула соединялась с DHE-RSA-AES128-SHA, что давало низкую производительность и высокую нагрузку на сервер. Я использую "Промежуточный список" в https://wiki.mozilla.org/Security/Server_Side_TLS и провел несколько стресс-тестов с шифрами и получил эти результаты для тех, которые работали:

Cipher                      Worst response time
DHE-RSA-AES128-SHA         15.745s
DHE-RSA-AES256-SHA         15.271s
AES128-SHA                 1.421s
AES256-SHA                 1.765s  
DES-CBC3-SHA               1.459s

Итак, как видите, DHE- * работает плохо, но AES128-SHA работает нормально. Поэтому, если вы думаете, что у вас проблемы с производительностью, создайте стресс-тест с несколькими сотнями или тысячами подключений и настройте nginx на использование только одного шифра. вы должны увидеть, работает ли какой-либо шифр плохо, и попытаться отключить его (не забудьте протестировать окончательную настройку на своих клиентах или использовать тест ssllabs чтобы узнать, не блокируете ли вы своих пользователей)

Еще пара вариантов: - Завершить SSL с помощью CloudFront, позвоните на свои серверы с помощью http. Запросы проходят через сеть AWS, которая, вероятно, безопаснее, чем общедоступный Интернет, но вы можете не захотеть этого делать, если у вас есть личные или финансовые данные. - Прекратить SSL на ELB, звоните на свои серверы по HTTP. Это внутри вашего VPC и в одном регионе, поэтому данные передаются по меньшему количеству ссылок. Опять же, это может быть не идеально в зависимости от ваших данных.

Прямо сейчас вы можете завершить SSL на CloudFront, настроив CloudFront еще один сеанс SSL между своим пограничным местоположением и исходным сервером. Это может быть двойной SSL, увеличивающий вашу задержку, и может быть основной причиной вашей проблемы. Это объяснило бы, почему ваши усилия не увенчались успехом, как вы ожидали.