NGINX / PHP-FPM 通过 https/SSL 访问时速度极慢

NGINX / PHP-FPM 通过 https/SSL 访问时速度极慢

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

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

仅 4-5kb 的静态文件通常需要超过 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 导致问题的断言是否正确。其次,关于如何纠正这个问题,有什么建议吗?

直到最近,同样的配置一直运行正常,所以我真的不确定发生了什么。

提前谢谢了。

答案1

ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;

您需要删除该条目

加密ECDHE-RSA-AES256-SHA384

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

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

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

openssl s_client -主机主机名-端口 443

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

相关内容