共计 1398 个字符,预计需要花费 4 分钟才能阅读完成。
晚上上线一个老项目,之前可以 [正常] 运行,是一个很简单的 web 系统,使用 docker 暴露服务。
系统的架构图如下,项目依赖了一个 UE 引擎做画面渲染,所以这些服务放在了实体机上,使用了云服务器做了一层穿透 + Nginx 代理,此外 web 服务依赖了一个部署在阿里云服务器上的 websocket
接口 [雷]。
+-----------------------+
| Internet |
+-----------+-----------+
|
+-----------v-----------+
| Nginx Proxy [云端] |
| (Layer 1 Proxy) |
+-----------+-----------+
|
+-----------v-----------+
| Docker Layer [本地] |
| +-------+ +-------+ |
| | Web | | Backend| |
| |Service| | Service| |
| +-------+ +-------+ |
| +-------------------+ |
| | Desktop UE App | |
| +-------------------+ |
+-----------------------+
问题过程
看起来 so easy,心理预期 20 分钟搞定。很快,一切都准备就绪了,突然,我发现一个 websocket
接口竟然没有通!并且返回的是 403 状态码。Status Code: 403 Forbidden
。
这是什么情况?403,难道是这个接口流量转发到了后端服务吗?我关闭了后端服务,发现竟然还是 403!!
那么这个接口本身正常吗?我打开 postman
发现接口正常运行。
那么难道是我的 web 容器内部的代理出问题了吗?我又绕过了云端 Nginx
服务,直接请求了容器暴露出来的路由。您猜怎么着,接口居然还是正常的!!!
那么,问题就一定出现在了 Nginx 上咯?赶紧问下 ChatGPT
,怀疑是转发的配置写的有问题,但是修改后再次验证,问题依旧!
使用关键词搜索 Google, Nginx websocket 403
, 发现还真有几篇文章说 Nginx 的配置,websocket 可能会检测 Origin 是否匹配,所以需要加上 proxy_set_header Origin '';
配置。终于可以解决了。
赶紧修改验证,满怀希望的一请求,发现还是 403 !!!
此时我已经饥肠辘辘搞了 2 个小时。索性开始摆烂了,我开始使用 get 请求去访问代理后的接口,页面一片空白,就像我的内心一样茫然。习惯性的查看一下接口返回了什么内容,这一看不要紧,居然看到了 iframe
的字段。
Non-compliance ICP Filing
破案
这是啥玩意,怎么居然有 ICP 未备案的警告⚠️!
打开链接一看,尼玛居然提示我没有备案,难道我备了个假案吗???
腾讯云和站长查询都能查到记录。气的吐血三升。终于破案了!
以上就是被浪费的 3 小时生命。希望这个帖子,能拯救一些因为阿里云备案问题被坑的朋友。
阿里云 websocket 403 Nginx