Apache与应用服务器握手异常需先区分TLS终结或穿透场景:TLS终结时异常在客户端→Apache链路,查error_log中SSL_do_handshake()失败;TLS穿透时异常在Apache→后端链路,常见502或“SSL handshake failed in proxy”,需启用mod_proxy_wstunnel、透传Upgrade/Connection头并配置SSLProxyEngine on。

排查 Apache 与应用服务器之间的协议握手异常,核心是区分两类不同场景:一类是 Apache 作为 TLS 终结点(即 HTTPS 入口,后端用 HTTP 或 AJP 连接应用),另一类是 Apache 作为反向代理转发 WSS/WebSocket 或 HTTPS 流量(即 TLS 穿透)。两者失败位置、日志线索和验证方法完全不同,不能混用。
先确认 Apache 扮演的角色
这是所有排查的起点。打开你的虚拟主机或代理配置,看关键指令:
- 如果用了 SSLEngine on + ProxyPass http://127.0.0.1:8080/:Apache 终结 TLS,后端走明文 HTTP —— 握手异常只发生在 Apache 与客户端之间,查 error_log 中 SSL_do_handshake() 失败;
- 如果用了 ProxyPass wss://127.0.0.1:8080/ 或 ProxyPass https://127.0.0.1:8443/ 且未配 SSLProxy* 指令:Apache 尝试转发加密流量但不理解协议 —— 握手失败发生在 Apache 与后端应用之间,错误常表现为 502、连接重置或 error_log 中 “Connection refused”“SSL handshake failed in proxy”;
- 如果用了 ProxyPass / http://127.0.0.1:8080/ + Upgrade / Connection 头透传(如 ProxyPreserveHost、RequestHeader set Connection "upgrade"):这是 WSS 代理标准配置,失败多因头部丢失或连接被过早关闭。
查 error_log,聚焦三类关键行
Apache 的访问日志(access_log)对握手异常基本无用,必须盯紧 error_log(路径通常为 /var/log/apache2/error.log 或 /var/log/httpd/error_log):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- SSL_do_handshake() failed 或 SSL_accept() failed:说明 TLS 在 Apache 入口就断了,问题在客户端→Apache 链路;
- proxy: error reading status line from remote server 或 Connection refused:说明 Apache 能连上后端,但后端拒绝响应或没监听,检查应用是否启动、端口是否开放、防火墙策略;
- SSL Library Error: error:XXXXXXX(如 error:1407609C):用 openssl errstr 1407609C 解析,可明确是“http request”(客户端误发 HTTP 到 HTTPS 端口)、“no shared cipher”(密码套件无交集)等;
- 若含 stapling: OCSP response error 或 unable to get local issuer certificate:说明 Apache 作为 TLS 客户端去连后端时,证书链或 CA 信任配置有问题(需配 SSLProxyCACertificateFile、SSLProxyVerify)。
针对性验证:绕过 Apache 直连后端
排除 Apache 干扰,快速锁定问题环节:
- 对 HTTP 后端:用 curl -v http://127.0.0.1:8080/health,看能否返回正常响应;
- 对 HTTPS 后端:用 curl -v --insecure https://127.0.0.1:8443/health(跳过证书校验),或指定 CA:curl -v --cacert /path/to/ca.pem https://127.0.0.1:8443/;
- 对 WSS 后端:用 wscat -c wss://127.0.0.1:8080/ws(需安装 wscat),观察是否能完成升级;若失败,再用 openssl s_client -connect 127.0.0.1:8080 -servername yourdomain.com 查 TLS 握手是否通;
- 若直连成功,但经 Apache 代理失败 → 问题一定出在代理配置或模块启用状态(确认 mod_proxy、mod_proxy_http、mod_proxy_wstunnel 已加载)。
检查代理配置是否完整支持协议升级
尤其对 WebSocket(WSS)和 HTTPS 穿透,Apache 默认不透传 Upgrade 请求头:
- 必须启用 mod_proxy_wstunnel(WSS)或 mod_ssl(HTTPS 代理);
- 代理块中需显式透传关键头:
RequestHeader set Upgrade "websocket"
RequestHeader set Connection "upgrade"
ProxySet keepalive=On - 禁用缓冲:SetEnv nokeepalive 和 SetEnv downgrade-1.0 可避免某些旧客户端兼容问题;
- HTTPS 代理必须加 SSLProxyEngine on,否则 Apache 不会尝试建立 TLS 连接至后端。

















