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

NGINX / PHP-FPM очень медленный при доступе через https / SSL

Примерно неделю назад я начал замечать ужасную производительность своего веб-приложения.

Мое приложение обслуживается на экземпляре 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

который включает эфемерный шифр Диффи-Хелмана с эллиптической кривой и заменяет его на

!kEDH
Unless 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» перед этими изменениями, то, скорее всего, это проблема.