晚上上线一个老项目,之前可以 [正常] 运行,是一个很简单的 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的字段。
<title>Non-compliance ICP Filing</title>
<script language="javascript" type="text/javascript">
window.onload = function () {
document.getElementById("mainFrame").src= "http://batit.aliyun.com/alww.html?id=00000000003937939399";
}
</script>
这是啥玩意, 怎么居然有 ICP 未备案的警告⚠️!
打开链接一看,尼玛居然提示我没有备案,难道我备了个假案吗???
腾讯云和站长查询都能查到记录。 气的吐血三升。终于破案了!
以上就是被浪费的 3 小时生命。 希望这个帖子,能拯救一些因为阿里云备案问题被坑的朋友。
阿里云 websocket 403 Nginx
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.