大约一周前开始,我开始注意到我的 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”,那么这很可能是问题所在。