Nginx反向代理WebSocket API时SSL握手超时问题解决
解决Nginx反向代理WebSocket时SSL握手超时问题
针对你遇到的SSL握手超时错误,从以下几个方向排查修复:
验证上游API的SSL证书可信度
Nginx默认会校验上游服务器的SSL证书,如果目标API使用自签名证书、证书链不完整,会直接导致握手失败。可以先临时添加proxy_ssl_verify off;到/ws/的location块中测试是否解决问题,但这只是临时方案,长期使用建议配置可信的CA证书:proxy_ssl_trusted_certificate /etc/ssl/certs/ca-certificates.crt; # 系统默认CA证书路径,或自定义证书路径 proxy_ssl_verify on; proxy_ssl_verify_depth 2;调整SSL握手超时时间
你添加的proxy_read_timeout是控制请求读取的超时,而SSL握手有单独的超时设置。在/ws/的location块中添加:proxy_ssl_timeout 120s; # 延长SSL握手超时时间,默认60秒排查网络连通性
在Nginx服务器上执行curl命令,直接测试与目标API的SSL连接:curl -v https://external-api.net:7890/signalr/negotiate?clientProtocol=2.1&apiKey=MYAPIKEY如果curl也出现握手超时,说明是网络层面的问题(比如防火墙拦截、目标API端口未开放、路由故障),需要先解决网络连通性。
优化Host头配置
当前配置的proxy_set_header Host external-api.net;可以尝试替换为proxy_set_header Host $proxy_host;,让Nginx自动使用proxy_pass中指定的主机和端口,避免Host头不匹配导致的问题。指定支持的SSL协议版本
如果目标API仅支持高版本SSL协议,可在location块中明确指定:proxy_ssl_protocols TLSv1.2 TLSv1.3;
修改后的完整/ws/location配置示例:
location /ws/ { proxy_pass https://external-api.net:7890/; set $args $args&apiKey=MYAPIKEY; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $proxy_host; # SSL握手相关配置 proxy_ssl_timeout 120s; proxy_ssl_protocols TLSv1.2 TLSv1.3; # 若证书不可信临时使用,后续需替换为可信证书配置 # proxy_ssl_verify off; }
内容的提问来源于stack exchange,提问作者sasani72
相关产品推荐
相关产品推荐

