我在 Ubuntu 14.04(几乎是默认设置)虚拟云服务器上遇到了 Apache 2.4.7 的问题。
在中等服务器负载(大约 2/3.0 CPU 使用率和大量可用内存)下,建立 HTTPS 连接的时间会延长至 5-15 秒(有时更长)。以下是 curl 输出示例,请查看时间:
My-MBP:~ me$ curl --trace-time --trace-ascii - https://domain.tld/some.png
20:44:40.952209 == Info: Trying 111.111.111.111...
20:45:16.046183 == Info: Connected to domain.tld (111.111.111.111) port 443 (#0)
20:45:32.371816 == Info: TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
20:45:32.371919 == Info: Server certificate: www.domain.tld
20:45:32.371946 == Info: Server certificate: GlobalSign Extended Validation CA - SHA256 - G2
20:45:32.372025 == Info: Server certificate: GlobalSign
20:45:32.372069 => Send header, 125 bytes (0x7d)
0000: GET /some.png HTTP/1.1
003c: Host: domain.tld
0055: User-Agent: curl/7.43.0
006e: Accept: */*
007b:
20:45:32.538703 <= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
20:45:32.538747 <= Recv header, 37 bytes (0x25)
0000: Date: Wed, 09 Dec 2015 19:47:34 GMT
20:45:32.538765 <= Recv header, 16 bytes (0x10)
0000: Server: Apache
20:45:32.538778 <= Recv header, 37 bytes (0x25)
0000: X-Powered-By: PHP/5.5.9-1ubuntu4.14
20:45:32.538795 <= Recv header, 23 bytes (0x17)
0000: Cache-Control: public
20:45:32.538810 <= Recv header, 42 bytes (0x2a)
0000: ETag: "1234567890"
20:45:32.538827 <= Recv header, 40 bytes (0x28)
0000: Expires: Wed, 09 Dec 2015 19:57:34 GMT
20:45:32.538844 <= Recv header, 22 bytes (0x16)
0000: Content-Length: 7159
20:45:32.538860 <= Recv header, 25 bytes (0x19)
0000: Content-Type: image/png
20:45:32.538876 <= Recv header, 2 bytes (0x2)
0000:
20:45:32.539541 <= Recv data, 7159 bytes (0x1bf7)
...
而且文件的传输速率也相当不错,只是建立连接的时间太长了。
但是:通过 HTTP 对同一文件进行的整体请求/响应非常快(<100 毫秒)。在使用量大时(>3.0),HTTP 和 HTTPS 有时也不会出现问题。
有什么建议么?
编辑:
<IfModule mod_ssl.c>
...
SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/urandom 512
...
</IfModule>
答案1
这不应该发生在“几乎默认”安装中,因此我建议您就此问题联系您的托管公司,看看他们是否已经知道该问题和/或他们可以修复它。
可能有助于解决问题的其他事项:
- 输出
openssl speed
- 尝试连接到普通的 openssl “服务器” 是否会有相同的连接延迟问题。 您可以通过在不同的控制台上使用以下命令来执行此操作:
对于服务器:
openssl s_server -4 -www -accept 444 -cert /etc/ssl/example.com.crt -key /etc/ssl/example.com.key -verify_return_error -debug
对于客户来说:
openssl s_client -debug -connect example.com:444
您可以尝试连接到https://example.com:444使用您的浏览器也可以。
- 检查您是否提供了中间链以及证书本身。
- 尝试在 mod_ssl.conf 中使用类似下面的内容来更改 apache 使用的密码套件:
SSLHonorCipherOrder On
SSLCipherSuite ALL:!ADH:!EXP:!LOW:!RC2:!3DES:!SEED:!RC4:+HIGH:+MEDIUM
检查你的托管公司的其他客户是否有同样的问题(尝试通过你周围的 IP 连接到 https)
检查使用 nginx 前端提供 https 服务是否可以解决问题