需升级nginx至1.19.0+以使用$ssl_handshake_time精确测量tls握手耗时,配置log_format记录$ssl_cipher与$ssl_handshake_time,再通过日志分析老旧套件(如rc4-sha)对延迟的影响并优化ssl_ciphers。

要在访问日志中记录 $ssl_cipher 并分析老旧加密套件对 HTTPS 握手响应时间的影响,核心是:启用 Nginx 的 SSL 模块变量支持、在 log_format 中显式引入 $ssl_cipher 和 $request_time(或更精确的 $ssl_handshake_time,需 1.19.0+),再结合日志分析定位慢握手问题。
确认 Nginx 版本与 SSL 变量可用性
Nginx 自 1.7.0 起支持 $ssl_cipher,但要获取握手耗时,需注意:
-
$ssl_handshake_time仅在 1.19.0+ 版本可用,它精确反映 TLS 握手阶段耗时(单位秒,含小数); - 若版本低于 1.19.0,可退而使用
$request_time减去后端处理时间(需配合$upstream_response_time估算),但精度较低; - 确保编译时启用了 OpenSSL 支持(默认开启),且未禁用 SSL 模块。
配置日志格式并捕获关键字段
在 http 块中定义带 SSL 信息的日志格式,例如:
然后在 server 或 location 块中启用该格式:
注意:$ssl_cipher 在非 HTTPS 请求中为空字符串,日志中会显示为“-”,可过滤掉 HTTP 请求避免干扰。
识别老旧加密套件并建立基线
常见老旧/低效套件包括:RC4-SHA、DES-CBC-SHA、SSLv3 协议下的套件、无 PFS 的 ECDHE-RSA-RC4-SHA 等。可通过以下方式辅助识别:
- 查阅 Mozilla SSL 配置生成器或 OWASP 加密推荐,明确已弃用套件列表;
- 用
openssl ciphers -V 'ALL:COMPLEMENTOFDEFAULT'查看当前 OpenSSL 支持的所有套件及其强度标识; - 在日志中提取高频出现的
$ssl_cipher值,按$ssl_handshake_time分组统计平均值和 P95,对比高性能套件(如ECDHE-ECDSA-AES128-GCM-SHA256)的延迟基线。
分析与优化建议
拿到日志后,可用 awk、grep 或 ELK 等工具快速筛查:
- 筛选握手时间 > 300ms 且 cipher 含
RC4或DES的请求:awk '$10 > 0.3 && $8 ~ /RC4|DES/' ssl_analysis.log; - 统计各 cipher 的平均握手延迟:
awk '{cipher[$8]+=$10; count[$8]++} END {for (c in cipher) print c, cipher[c]/count[c]}' ssl_analysis.log | sort -k2 -n; - 若发现老旧套件显著拖慢(如比主流套件高 2–5×),应在
ssl_ciphers中移除它们,并启用ssl_prefer_server_ciphers on确保服务端优先选择高效套件; - 同时检查是否启用了 OCSP Stapling(
ssl_stapling on)和合理缓存(ssl_session_cache shared:SSL:10m),这些也会影响握手性能。











