晚上上线一个老项目,之前可以 [正常] 运行,是一个很简单的 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.