📝 我发现 NapCat 有个插件的 WebSocket 只能在 HTTP 下有效(然后我被 CF 免费版教育了)
最近折腾 NapCat 的时候,我踩了一个特别离谱、但回头看又觉得挺好笑的坑。
事情是这样的—— NapCat 有个插件的 WebSocket 接口,我本来以为随便反代一下就能跑。结果我在 HTTPS 下怎么连都连不上,浏览器永远给我来一句:
WebSocket 连接失败,Error 1006
我一开始还以为是我 Nginx 配置写错了,或者 NapCat 的路径没对上。于是我开始了长达半天的排查:
- 反代改了又改
- header 加了又加
- ws / wss 来回切
- 连 Docker 端口都重新映射了几次
结果依旧是:HTTP 下秒连,HTTPS 下死活不行。
我当时整个人都不好了。
🧩 真相只有一个:Cloudflare 免费版强制 HTTP/2
我最后盯着 Cloudflare 的文档看了几分钟,突然意识到一个事实:
Cloudflare 免费版强制使用 HTTP/2,而 HTTP/2 对 WebSocket 的支持是残缺的。
换句话说:
- HTTP → WebSocket 正常
- HTTPS(CF 免费版)→ WebSocket:你想啥呢兄弟
Cloudflare 免费版根本不给你 HTTP/1.1 直通,而 WebSocket 又必须依赖 HTTP/1.1 的 Upgrade 机制。 于是我这边怎么改都没用,CF 那边直接把我给“优化”掉了。
我当时的心情大概就是:
“好吧,那就不聊了之了。”
🧠 总结一下这次的血泪教训
- NapCat 插件的 WebSocket 在 HTTP 下完全没问题
- 一旦走 HTTPS + Cloudflare 免费版,就会因为 HTTP/2 被强制启用而直接寄
- 你以为是 Nginx 配置问题,其实是 Cloudflare 在背后悄悄给你上了一刀
如果你真的想让它在 HTTPS 下跑起来,那只有几条路:
- 用 Cloudflare Pro(支持 HTTP/1.1 回源)
- 不走 CF,直接自己上证书
- 用 Cloudflare Tunnel(它支持 WebSocket)
- 或者……继续用 HTTP,反正内网用也没啥
🧩 最后
这事儿折腾完,我只想说一句:
Cloudflare 免费版:我优化你是为你好。 我:谢谢你哦,我不用了。
(use ai)