启用SSL的Nginx无法连接K8s集群内80端口Node.js WebSocket服务
故障排查思路
1. SSL基础配置校验
- 确认SSL证书有效性:执行
openssl s_client -connect 你的服务域名:443查看证书是否过期、域名是否匹配、证书链是否完整,若使用自签证书,客户端必须信任对应证书否则会直接拒绝连接 - 排查Nginx错误日志:打开你配置的debug级错误日志
/var/log/nginx/error.log,搜索SSL握手相关报错、请求转发到后端的报错信息,优先定位故障出在SSL握手阶段还是转发到WebSocket服务阶段 - 确认端口放行规则:检查服务器防火墙、云服务商安全组是否开放了443端口的公网访问权限
2. Nginx代理配置修正
你当前的Nginx配置缺少WebSocket代理必须的参数,按以下规则调整:
- 补全请求头配置:在
/ws的location块中添加以下内容,解决后端服务Host校验、来源校验失败的问题
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
- 优化Connection头匹配逻辑:不要写死Connection为upgrade,适配不同请求场景,替换原有
proxy_set_header Connection upgrade;为proxy_set_header Connection $connection_upgrade;,同时在Nginx全局http块中添加如下变量定义:
map $http_upgrade $connection_upgrade { default upgrade; '' close; }
- 调整长连接超时配置:WebSocket为长连接,默认Nginx代理60s无流量会主动断开,在location块中添加如下配置延长超时时间:
proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d;
3. K8s服务校验
- 确认你配置的
server-ip:80是可以从Nginx所在节点正常访问的K8s Service ClusterIP/NodePort,不要直接填Pod IP(Pod重建后IP会变动) - 登录Nginx所在服务器执行
curl -v http://server-ip:80/ws,确认K8s网络策略、节点防火墙没有拦截Nginx到后端服务的请求
4. 客户端连接校验
- 确认客户端连接地址为
wss://你的服务域名/ws,不要误写为ws协议、漏写/ws路径或者填错域名 - 如果是浏览器端访问,打开F12控制台的网络标签页,查看WebSocket请求的具体报错:
- 证书类报错:优先处理SSL证书信任问题
- 502错误:Nginx无法转发到后端,优先排查Nginx到K8s服务的连通性
- 400错误:后端服务拒绝请求,优先检查请求头是否完整
内容的提问来源于stack exchange,提问作者sonia kaushal
相关产品推荐
相关产品推荐

