通过 https/SSL 访问时,NGINX/PHP-FPM 非常慢

use*_*246 3 ssl nginx php-fpm

从大约一周前开始,我开始注意到我的 web 应用程序的性能很差。

我的应用程序在 Amazon EC2 m1.large 实例上提供服务。

仅 4-5kb 的静态文件通常需要超过 10 秒才能接收。这会间歇性地发生,但对于每个页面加载,我可以预计特定资源至少需要一到两个巨大的等待时间。

从检查 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在诊断这类问题时,我非常缺乏经验,很可能我误读了上述工具的输出。无论如何,尽管在谷歌上进行了大量搜索,但我仍然不知道从哪里开始。

我的相关部分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;
Run Code Online (Sandbox Code Playgroud)

首先,我想知道我是否认为是 SSL/HTTPS 导致问题的说法是正确的。其次,对于我将如何纠正它有什么建议。

直到最近,完全相同的配置才能完美运行,所以我真的不确定发生了什么。

提前谢谢了。

小智 7

ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
Run Code Online (Sandbox Code Playgroud)

您需要删除该条目

ECDHE-RSA-AES256-SHA384

启用椭圆曲线 Diffie-Helman 临时密码并将其替换为

!kEDH
除非您需要完美的前向保密,否则这是不必要的,并且是您看到请求长时间延迟的原因。对于大多数应用程序,HIGH 密码条目应该是完全合理的。

*快速编辑:您可以使用 openssl 命令行实用程序查看正在协商的密码:

openssl s_client -host HOSTNAME -port 443

用您正在查看的服务器的 IP 或域名替换主机名。如果您在这些更改之前在“密码”行中看到“DHE-RSA-AES256-SHA”,那么这很可能是问题。