BLOG

nginx

2026/04/25 7 min read BLOG 编程规范 NGINX

你这个判断是对的:这条链路“逻辑是完整的,但拓扑图是不完整的”,因为你漏掉了一个关键现实层——170 服务器本身在链路里的位置没有被标出来


✅ 先给你标准答案

你的链路少了一层“物理宿主机层”。


🧠 正确的完整链路应该是这样:

客户端

https://key.tengokukk.com/openai/v1
(DNS → 指向 170.106.179.226)

170.106.179.226(真实物理服务器 / VPS / host machine)

Nginx(部署在 170 服务器上)

127.0.0.1:3301(170 服务器本机 loopback)

Node Token Pool runtime(同一台 170 服务器进程)

📌 关键点解释(你漏掉的就是这个)

❗ “170 服务器在哪里?”

👉 它不是“一个步骤”,它是整个 runtime 的宿主机

也就是说:

170.106.179.226 = 承载 Nginx + Node runtime 的物理机器


🧩 用更工程化的视角看

你现在其实是这个结构:

🌐 外部视角(客户端看到的)

Client

Domain (key.tengokukk.com)

🖥️ 网络层(DNS)

key.tengokukk.com
→ 170.106.179.226

🏠 服务器内部(170机器内部)

Nginx (public ingress)

127.0.0.1:3301 (local service)

Node runtime

⚠️ 你当前图的问题本质

你现在的图是:

只画了“应用链路”,没画“物理宿主层”

所以缺了一层:

DNS / Host Layer(170.106.179.226)

🧠 一句话帮你纠正模型

你现在应该用这个 mental model:

❌ 你画的是 request flow
✔ 但缺的是 deployment topology


🔥 标准工业版正确结构(推荐你用这个当 canonical)

[Client]

[DNS: key.tengokukk.com]

[Host: 170.106.179.226]

[Nginx (ingress layer)]

[127.0.0.1:3301 (private loopback)]

[Node Token Pool Runtime]

[Provider Pool / Upstreams]

⚠️ 再补一个你容易忽略的点(很关键)

你现在图里还缺最后一层

❗ provider 才是最终真实执行层

你现在写到:

Node 服务(Token Pool runtime)

但真实链路通常是:

Node runtime

Provider Pool

OpenAI / Claude / other upstream APIs

✔ 总结(直接结论)

你问的两个点:

❓ 链路完整吗?

👉 不完整(缺 host + provider 层)


❓ 170 服务器在哪?

👉 它就是:

DNS 指向的那台物理机器(170.106.179.226),承载 Nginx + Node runtime 的宿主机


🧠 如果你想再升级一步(建议)

你现在这套已经可以升级成:

Control Plane / Data Plane / Host Plane 三层架构图

如果你要,我可以帮你画一个:

  • 完整 ingress / runtime / provider topology

  • 加上 failure path(502 / 429 / fallback)

  • 加上 routing decision point

会比你现在这个图再工业级一档。

上游 402 ↓ handleStreamRequest 进入错误分支 ↓ res.write(error) ↓ res.end() ↓ finally 又 res.end() ↓ ERR_STREAM_WRITE_AFTER_END ↓ Node 抛异常 ↓ aiclient-2-api-mock.service 崩 ↓ Nginx → 502 Bad Gateway

我给你人话+底层原理,一次性讲懂「为啥非要多一层 127.0.0.1」,超好理解。 --- ## 先记两个关键 1. 你项目 .env 里: ini HOST=0.0.0.0 SERVER_PORT=3301 0.0.0.0 = 本机所有网卡都能连(内网、外网、本地都行) 2. 但你 Nginx 刻意写成了 proxy_pass http://127.0.0.1:3301 --- ## 核心问题: ### 明明可以直接用 公网IP:3301 为什么 Nginx 非要绕一下,发给 127.0.0.1? --- # 一、最核心原因:安全(第一优先级) ### 方案A(不安全,不推荐) 直接暴露: 外网 → 170.106.179.226:3301 → Node程序 - 3301 端口直接裸露公网 - 任何人扫端口、暴力请求、攻击、爬虫、CC 都能直接打你程序 - Node 直接扛外网压力,容易崩、被打挂 ### 方案B(你现在的架构,标准最佳实践) 外网 → Nginx(443/https) → 127.0.0.1:3301 → Node - 3301 端口只允许服务器自己访问 - 外网完全碰不到你的 Node 程序 - 所有攻击、恶意流量、垃圾请求,全部先被 Nginx 挡住 👉 127 就是一道隔离墙 --- # 二、127.0.0.1 是什么? - 127.0.0.1 = 本机闭环地址 - 只有这台服务器自己能访问 - 外面设备、别的VPS、手机、电脑,永远连不上 127 所以: Nginx 跟 Node 都是同一台机器内部对话,走本地回路,不走公网,又快又安全。 --- # 三、额外好处(为啥行业全都这么干) 1. 统一管理 HTTPS/证书 证书、域名、SSL 全部丢给 Nginx 配置,Node 不用管,省心。 2. 隐藏后端结构 外人只看见你的域名,看不见端口、看不见你是 Node 池子、看不见架构。 3. 方便扩容/切换 以后哪怕把 Node 改成 127:3302、3303,只改 Nginx 一行配置就行。 4. 限速、防爬、缓存、日志 全部由 Nginx 前置处理,减轻你的 AI 池子压力。 --- # 四、举个生活化例子 - Node 程序 = 家里保险柜 - Nginx = 小区大门+保安亭 - 127.0.0.1 = 小区内部专属小路 外人只能走到小区大门(域名/443) 不能直接冲到你家保险柜门口(3301公网暴露) 保安(Nginx)检查完,走内部小路送货上门。 --- # 五、直白总结回答你 1. 不是程序只能用127; 2. 是人为故意让 Nginx 用 127 内网转发; 3. 目的:隔离外网、保护端口、安全、好管理证书; 4. 外部用户照常通过你的域名 key.tengokukk.com 正常使用,毫无感知。 --- ## 你想不想看: 我给你写一份「不用127、直接公网3301裸奔」的对比,让你一眼看懂差别多大?