架构大修记:从“单机硬扛”到“分布式正规军”
最近给我的项目 “兔特科技技术博客” 做了一次彻头彻尾的技术升级。折腾了好几天,踩了无数只有亲历过才会懂的坑,现在终于全线通车了,回头看,这不仅是服务器搬了个家,更是从“作坊思维”到“架构思维”的转变。
想把这段心路历程记下来,顺便给后面想折腾阿里云 CDN、OSS、NLB 和 WebSocket 的兄弟们留个“保命指南”。
1. 曾经的 1.0 时代:简单粗暴,大力出奇迹
刚开始的时候,我的架构极其纯粹:
- 一台 ECS 服务器:逻辑全在里面,API 跑在里面,WebSocket(WS)也跑在里面。
- Nginx 统管一切:不同的业务模块通过 Nginx 做路径转发,指向本地不同的 Docker 端口。
- OSS 裸奔:静态资源放在 OSS 里,没加 CDN,直接通过 OSS 域名访问。
那会儿的逻辑是: 性能不够了?加 CPU!加内存!带宽卡了?买更大的固定带宽!
这种方案虽然省心,但到了“技术升级”的关口,它的天花板一眼就能看到:带宽太贵了(1000M 带宽那价格能看哭,一个月要八万人民币),而且安全性基本为零,服务器 IP 全程裸奔,一个 DDoS 过来全家就得进黑洞。
2. 现在的 2.0 时代:动静分离,各司其职
为了迎接未来可能到来的 10 万 CCU(同时在线用户),我把架构彻底重组了:
- 静态内容(Blog + 资源包):CDN + OSS 组合。资源丢在 OSS 私有桶,外面套一层 CDN。快是真的快,省也是真的省(回源走内网免流)。
- 动态接口(API + WSS):NLB (网络负载均衡) + ECS 集群。这是这次升级最硬核的部分。NLB 负责解开 HTTPS 的加密壳子,把明文传给 ECS 上的 Nginx,再转给后端。
- 计费模型:全线接入 CDT(云数据传输)。每个月白嫖 20GB 流量,全家桶共享。
3. 那些让我“脑壳疼”的坑
升级过程中,我经历了从 404 到 403 再到 400 的“报错全家桶”:
坑一:CDN 真的玩不转 WebSocket
我本想全站走 CDN,结果发现阿里云标准 CDN 对 WebSocket 极其不友好。无论怎么配回源头,始终报 400 错误。
感悟:标准 CDN 是搞“复印转发”的,不适合“实时通话”。最后果断切换到 NLB(四层负载均衡),世界瞬间安静了。
坑二:回源 HOST 的“身份危机”
这是最坑的一个点。CDN 找 Nginx 拿数据,如果不手动在云端设置“回源 HOST”,Nginx 根本不认这个请求。
- 表现:明明 Nginx 就在那,本地测也通,但公网访问就是 404。
- 解药:在“指定源站回源 HOST”里,把域名手写进去。这就好比给快递员指明了具体的单元门牌号。
坑三:跨域(CORS)的梅开二度
因为我把 API 搬到了 gameapi.erdianzhang.cn,跨域挑战开始了。
- 现象:浏览器报错
Multiple values in Access-Control-Allow-Origin。 - 真相:Nginx 处理了一次,后端 Go 代码又处理了一次。两个“通行证”叠在一起,浏览器直接拒收。
- 搞定:Nginx 只负责把
OPTIONS这种探路请求拦截并返回 204,真正的业务请求头留给后端自己发。
4. 1.0 vs 2.0:这几天的汗水换来了什么?
| 维度 | 1.0 模式 (单机模式) | 2.0 模式 (架构模式) | 解决的问题 |
|---|---|---|---|
| 性能瓶颈 | 受限于单台机器的垂直升级 | 随时加 ECS 实例,水平无限扩展 | 10 万并发连接不再是梦 |
| SSL 压力 | Nginx 负责解密,吃 CPU | NLB 硬件级卸载 SSL,服务器只跑业务 | 单机承载力提升 30%+ |
| 网络成本 | 昂贵的固定带宽,利用率低 | CDT 流量计费 + 共享带宽,用多少付多少 | 省下一大笔“保底费” |
| 稳定性 | 单区运行,机房出事就挂 | 双可用区、双交换机容灾 | 真正的生产级高可用 |
| WebSocket | Nginx 直连,协议支持看运气 | NLB 原生支持,稳定不掉线 | 解决掉线和握手报错 |
5. 总结
现在的 “兔特科技技术博客” 已经不再是一个简单的网页,而是一套标准的、能够随时扩容支撑大流量的分布式系统。
以前觉得“能跑通就行”,现在发现,好的架构是让每一个字节都走在最合适的路上:
- 图片和 JS 这种“死东西”:交给 CDN 缓存,让它在离用户最近的地方闪现。
- 坐标同步这种“活数据”:交给 NLB,让它在最稳的隧道里飞奔。
虽然这几天为了调通这些规则没少掉头发,但当看到 Docker 日志里跳出那行 101 Switching Protocols(WebSocket 握手成功)的时候,一切都值了。
这就是架构的魅力吧。祝大家写代码不跨域,配 CDN 不 404!