Примерно неделю назад я начал замечать ужасную производительность своего веб-приложения.
Мое приложение обслуживается на экземпляре Amazon EC2 m1.large.
Получение статических файлов размером всего 4–5 КБ часто занимало более 10 секунд. Это могло происходить с перерывами, но для каждой загрузки страницы я мог ожидать как минимум 1-2 огромных времени ожидания для определенного ресурса.
Из проверки Firebug стало ясно, что задержка была в «ожидающей» части запроса. (DNS / подключение / отправка и получение всегда были в порядке)
К сожалению, у меня пока нет необходимой репутации, чтобы размещать изображение, иначе я бы сделал это.
Что еще хуже, когда страница запрашивает много статических ресурсов, таких как изображения, почти каждый запрос, похоже, демонстрирует эту проблему.
Поигравшись с моей конфигурацией NGINX и PHP-FPM на прошлой неделе или около того, я не получил ни одного места до сегодняшнего дня, когда я заметил, что проблема существует только тогда, когда к серверу осуществляется доступ через HTTPS.
Это можно увидеть при использовании ab
команда для проверки работоспособности.
HTTPS:
ab -c 100 -n 3000 https://www.mydomain.com/
Server Port: 443
SSL/TLS Protocol: TLSv1,RC4-SHA,2048,128
Document Path: /
Document Length: 13367 bytes
Concurrency Level: 100
Time taken for tests: 12.122 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 41205000 bytes
HTML transferred: 40101000 bytes
Requests per second: 247.48 [#/sec] (mean)
Time per request: 404.067 [ms] (mean)
Time per request: 4.041 [ms] (mean, across all concurrent requests)
Transfer rate: 3319.52 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 13 219 91.2 216 577
Processing: 18 178 83.5 166 562
Waiting: 10 168 80.5 156 549
Total: 60 397 124.9 386 809
HTTP:
ab -c 100 -n 3000 http://www.mydomain.com/
Server Port: 80
Document Path: /
Document Length: 184 bytes
Concurrency Level: 100
Time taken for tests: 0.468 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Non-2xx responses: 3000
Total transferred: 1431000 bytes
HTML transferred: 552000 bytes
Requests per second: 6404.06 [#/sec] (mean)
Time per request: 15.615 [ms] (mean)
Time per request: 0.156 [ms] (mean, across all concurrent requests)
Transfer rate: 2983.14 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 3 7 2.2 8 11
Processing: 2 8 2.4 7 18
Waiting: 1 6 2.0 6 16
Total: 11 15 1.4 15 28
Я очень неопытен, когда дело доходит до диагностики такого рода проблем, и вполне возможно, что я неправильно интерпретирую вывод вышеуказанного инструмента. Тем не менее, несмотря на огромное количество поисков в Google, я все еще не знаю, с чего начать.
Соответствующая часть моего nginx.conf
:
#SSL certs
ssl on;
ssl_certificate /etc/ssl/certs/mycert.crt;
ssl_certificate_key /etc/ssl/certs/mycert.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
Во-первых, я хотел бы знать, нахожусь ли я на правильном пути с моим утверждением, что проблема связана с SSL / HTTPS. Во-вторых, как есть какие-либо предложения относительно того, как я могу это исправить.
Та же самая конфигурация работала безупречно до недавнего времени, поэтому я действительно не уверен, что произошло.
Спасибо заранее.
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
Вам нужно будет удалить запись
ECDHE-RSA-AES256-SHA384
который включает эфемерный шифр Диффи-Хелмана с эллиптической кривой и заменяет его на
!kEDHUnless you require perfect forward secrecy, this is unnecessary and is the cause of the long delays you are seeing for requests. The HIGH cipher entry should be perfectly reasonable for most applications.
* Быстрое редактирование: вы можете посмотреть, какие шифры согласовываются, используя утилиту командной строки openssl:
openssl s_client -host HOSTNAME -port 443
Замена имени хоста IP-адресом или доменным именем сервера, на который вы смотрите. Если вы видите «DHE-RSA-AES256-SHA» в строке «Cipher» перед этими изменениями, то, скорее всего, это проблема.