💡
原文中文,约2500字,阅读约需6分钟。
📝
内容提要
在使用Kubernetes、NGINX Ingress和WebSocket服务时,CDN(Funnell)返回403 Forbidden。经排查发现,问题在于CDN未开启WebSocket支持及请求路径未被允许回源。解决方案是开启WebSocket支持、配置回源路径白名单,并确保请求头透传。调整后,WebSocket连接成功,服务稳定。
🎯
关键要点
- 使用Kubernetes、NGINX Ingress和WebSocket服务时,CDN(Funnell)返回403 Forbidden。
- 问题在于CDN未开启WebSocket支持及请求路径未被允许回源。
- 解决方案是开启WebSocket支持、配置回源路径白名单,并确保请求头透传。
- 确认Ingress配置正确,路径/push/ws会被重写并转发给go-push服务。
- 测试绕过CDN,直连Ingress,返回101 Switching Protocols,说明Kubernetes服务与Ingress正常。
- CDN拒绝连接日志表明403来自CDN层拦截,主要怀疑WebSocket未开启支持。
- 在Funnell CDN控制台中开启WebSocket支持,配置回源路径白名单,确保请求头透传。
- 完成配置后,通过WebSocket客户端访问得到正确响应,服务端日志打印握手成功。
- 总结:CDN安全策略或协议限制可能导致403 Forbidden,需检查WebSocket支持、回源路径和关键握手头部。
❓
延伸问答
为什么通过CDN访问WebSocket时会返回403 Forbidden?
返回403 Forbidden的原因通常是CDN未开启WebSocket支持或请求路径未被允许回源。
如何解决CDN返回403 Forbidden的问题?
解决方案包括开启WebSocket支持、配置回源路径白名单,并确保请求头透传。
在Kubernetes中如何配置WebSocket服务?
需要在Ingress配置中设置正确的proxy_set_header和路径转发规则,确保WebSocket请求能够正确转发。
如何验证WebSocket服务是否正常工作?
可以通过curl命令模拟WebSocket握手,若返回101 Switching Protocols,则说明服务正常。
CDN的哪些配置可能导致WebSocket请求失败?
CDN未开启WebSocket支持、请求路径未在白名单中、请求头未透传等配置都可能导致请求失败。
如何确保WebSocket请求头不被CDN篡改?
需要在CDN配置中设置请求头透传,确保Connection、Upgrade和Sec-WebSocket-*等头部不被移除或篡改。
➡️