给自家 LiteLLM 网关排 Cloudflare 回源问题,真正烦人的不是 522/524 本身,而是 Codex 正准备分析 curl 日志时,模型通道先断了:官方额度烧完、多把 Key 切来切去、想换一个不中断的模型又得重新配一遍供应商。我这次的做法是先给 Codex 一条稳定的统一 API 通道 TaoToken,注册、创建 Key 都在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 完成,把 Base URL 填成 https://taotoken.net/api,然后让 Codex 专心回去查 gw.jpgcp.cloud:31850 的 522 和 524。这篇就记录这条排障链路,以及顺着原文把 DNS-Only、Origin Rules、Kong read-timeout 分别算清楚的完整过程。
1. 先把 Codex 喂饱:排障日志需要一个不中断的模型通道
1.1 三个报错分别断在 Cloudflare 哪一层
原文里第一次请求是curl http://gw.jpgcp.cloud:31850/litellm/health/liveliness,现象是连接超时;第二次换到标准 443 端口,变成HTTP/2 522;再往后用非流式请求跑长思考模型,又多出524。这三组日志不是同一类故障,断点分别在 Cloudflare 边缘的三个不同位置。
31850 端口超时,是因为 Cloudflare 免费版边缘代理只监听固定白名单端口,31850 不在列表里,TCP 握手包到边缘就被丢弃。522 则是边缘接受了客户端的 443 请求,但回源时默认去连源站的 80 或 443,而 K3s 里 Kong 实际监听在 NodePort 31850,源站根本没有进程响应这个握手,Cloudflare 判定源站不可达。524 更特殊:边缘和源站已经连通,但非流式请求下模型思考超过 100 秒,Cloudflare 硬编码的读取超时先动手切断连接。
把这三段日志贴给 Codex 时,它很快会指出:问题不在 LiteLLM 的模型配置,而在 Cloudflare 边缘链路。这个判断方向非常重要,否则你会一直去调 LiteLLM 的重试参数,而真正的断点始终在源站前面的 CDN 层。
1.2 排障这类问题,Codex 最怕上下文被掐断
排查回源问题需要连续读多轮日志、对比不同方案的端口矩阵、再确认超时链路上每一层的阈值。Codex 的强项就是把这些信息放在同一个上下文里做交叉判断,但前提是它自己调用的模型接口足够稳定。
之前遇到过很尴尬的情况:Codex 正在对比 DNS-Only 和 Origin Rules 的取舍,模型调用却因为多 Key 切换把一段分析切成了两截,后面的对话完全忘了前面 curl 日志里的关键字段。后来我把 Codex 的 provider 指到 TaoToken,这类问题就消失了。TaoToken 是一套统一接入通道,不绑定某一个具体模型,Key 在官网创建后就能直接用于 Codex,排障过程中反复跨模型切换也不会打断上下文。
2. 给 Codex 装入 TaoToken:config.toml 只改三处
2.1 拿 Key 和选模型都看同一处
准备材料这一步,原文是去 Cloudflare 控制台改 DNS 记录,再回到自己的网关配置文件里填 Key。落到我们这条排障任务上,动作改成:打开 TaoToken 注册并创建 API Key,得到YOUR_API_KEY。
需要强调的是,模型 ID 不要照着记忆里的名字填。TaoToken 模型广场上展示的是当前可用的模型 ID,打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看模型广场,以页面标注为准。Codex 的model字段就写你在广场上选中的那个 ID,而不是原文里 gemini-3.7-flash 这种网关侧自定义别名。
2.2 Codex 的 model_provider 指向 https://taotoken.net/api
Codex 的配置文件是~/.codex/config.toml,只需要新增一个 model_provider,再把model指到模型广场上的 ID。这里的 Base URL 与官网落地页是两回事:填进配置文件的必须是https://taotoken.net/api,末尾不要加/v1。
# ~/.codex/config.toml # model 的值请从 TaoToken 模型广场选择一个模型 ID 后替换 model = "YOUR_MODEL_ID" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"env_key这一项只写环境变量名,真正的 Key 值放在环境变量里。在终端里先导一次:
export TAOTOKEN_API_KEY="YOUR_API_KEY"想让配置长期生效,就把这行写入~/.bashrc或~/.zshrc。注意不要直接把YOUR_API_KEY写进 config.toml,否则 Key 会跟着配置文件一起被同步或提交。
2.3 快速确认 Codex 能通过 TaoToken 说话
不需要启动完整对话,先用一条简单命令验证通路:
codex exec --provider taotoken "用一句话说明 HTTP 522 和 524 的区别"如果返回结果正常,说明 Codex 已经能通过 TaoToken 稳定调用模型。接下来进入正题,让 Codex 去啃原文里那组 Cloudflare 回源排障日志。
3. 让 Codex 判断:DNS-Only 直连还是 Origin Rules 重写端口
3.1 喂给 Codex 的排障素材
让 Codex 做架构取舍,必须把现场信息喂全。我把这些问题整理成一个 Prompt 模板,你替换成自己的信息就能用:
我正在排查 LiteLLM 网关接入 Cloudflare 后的回源问题。 环境信息: - K3s 集群内 Kong Gateway 对外端口为 NodePort 31850 - 源站节点公网 IP 为 134.185.90.98 - 域名 gw.jpgcp.cloud 由 Cloudflare 托管,当前 DNS 记录为 Proxied - 客户端 curl 不带端口访问 https://gw.jpgcp.cloud/litellm/v1/models 时,偶发 HTTP 522 - 非流式长推理请求超过 100 秒后返回 HTTP 524 请分析我贴出的 curl -i 日志,指出故障断点,并对比 方案一:DNS-Only 灰色云朵直连源站 31850 端口 方案二:保持 Proxied 并配置 Cloudflare Origin Rules 将回源端口重写为 31850 最后给出 Kong read-timeout 的具体调整建议。 注意:不要连接或执行生产环境的任何命令。这里让 Codex 只做分析和文案输出,真正的诊断命令仍然由你在自己的终端里执行。它的作用是帮你看懂日志、推演链路,而不是替你登录服务器。
3.2 Codex 给出的方案对比口径
Codex 收到这份素材后,输出的结论基本会围绕下面这几个维度展开,这些也正是原文里方案对比表的核心列:
| 评估维度 | DNS-Only 直连 | Origin Rules 重写端口 |
|---|---|---|
| URL 形态 | http://gw.jpgcp.cloud:31850 | https://gw.jpgcp.cloud(无端口) |
| 长推理超时 | 无 CDN 层截断,Kong 自主控制 | 非流式 100 秒硬截断,容易触发 524 |
| 源站 IP 暴露 | 直接暴露 OCI 真实 IP | 隐藏源站,对外只暴露 Cloudflare Anycast IP |
| 云资源占用 | 不新增任何云资源 | 不新增任何云资源 |
| 排障链路 | 只需要查客户端到源站的链路 | 多一层边缘转发,需要同时排查回源端口 |
Codex 的判断与原文的工程结论一致:在 Phase 1 阶段,如果只有一台 free-arm-vm,并且客户端都能接受带端口访问,优先选 DNS-Only。它把 31850 端口完全透明地暴露给客户端,绕开了 Cloudflare 的端口白名单和 100 秒超时,长推理模型不会被边缘层掐断。Origin Rules 更适合对 URL 纯净度有硬性要求的对外场景,但 100 秒限制没法通过规则本身突破,配合流式请求才能规避 524。
4. Kong read-timeout 建议:Codex 给的是可落地参数,不是口号
4.1 524 的超时链在哪里掐断
Cloudflare 免费版的 100 秒读取超时是硬编码的,控制台没有地方可以调大。因此要解决 524,核心思路不是去 Cloudflare 那边找开关,而是同时做两件事:让客户端开启stream: true,让服务端把 Kong 的 read timeout 调到远大于 100 秒。这样首字节返回前的等待时间被大幅放宽,只要服务端持续在计算并输出思考 Token,连接就不会被误杀。
Codex 在分析这条超时链时,会列出请求经过的每一层超时上限:客户端等待时间、Cloudflare 边缘 100 秒、Kong 的 read timeout、LiteLLM 自身的内核空闲时间。它给出的建议是,把 Kong 的read和write超时都设为180000毫秒,也就是原文里提到的read-timeout: 180000。这个值不是随便拍的,它需要覆盖最慢一次长推理的首 Token 生成时间,同时给 LiteLLM 转发上游响应留出余量。
4.2 把参数写进 Kong 配置
Kong 在 K3s 里的部署形态不同,配置落点也不一样。下面是 Service 或 Route 层级的超时配置片段,单位是毫秒:
# Kong 网关配置,适用于 Service 或 Route 上的 timeout 字段 # 实际部署时按你使用的 Kong Ingress Controller 版本调整位置 routes: - name: litellm-nodeport-31850 paths: - /litellm/ strip_path: false timeout: connect: 60000 write: 180000 read: 180000如果你的 Kong 是通过 Helm 部署在 K3s 里的,这个片段通常对应values.yaml中 route 的timeout配置;如果用的是声明式kong.yml,则直接放在 route 下。Codex 在这里只负责生成建议,真正执行helm upgrade或kubectl apply的仍然是你本地的操作终端。
4.3 怎么验证长推理不再 524
调整完 Kong 配置后,不要直接拿生产流量去压测,先用一条带stream: true的 curl 命令做对照验证。这条命令在你自己的终端里执行,Codex 不会代替你连生产环境:
curl -s -X POST "http://gw.jpgcp.cloud:31850/litellm/v1/chat/completions" \ -H "Authorization: Bearer $LITELLM_MASTER_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "<你在 LiteLLM 里配置的思考模型名>", "messages": [{"role": "user", "content": "请逐步推理一个需要长思考的问题"}], "stream": true }' -N把这条命令的输出贴回 Codex 的对话里,它会根据响应时间和是否出现stream事件,判断 524 是否已经消除。如果仍然出现超时,优先检查 Kong 的 read timeout 是否真的生效,而不是怀疑 Cloudflare 边缘配置。
5. 用一次完整排障对话验证整条链路
5.1 实际 Prompt 怎么组合
把前面的素材整合成一个完整的排障对话,可以这样发:
我给 Codex 提供以下信息: 1. curl -i https://gw.jpgcp.cloud/litellm/v1/models 返回 HTTP/2 522 的完整响应头 2. curl -X POST .../chat/completions 不带 stream 参数、返回 524 的日志 3. 当前 Kong Gateway NodePort 是 31850,OCI 安全组已放行 80/443/31850 4. Cloudflare DNS 记录当前为 Proxied 橙色云朵 请完成三件事: - 判断 522 和 524 各自的断点层级 - 对比 DNS-Only 直连与 Origin Rules 端口重写的优劣 - 给出 Kong read timeout 的具体调整参数与验证命令Codex 在拿到这些素材后,会先把 522 和 524 分开处理:522 指向回源端口不匹配,524 指向边缘读取超时。它会建议你短期切换 DNS-Only 验证链路,同时准备 Origin Rules 作为保留纯净 URL 的备选。
5.2 对照原文的验收结果
原文在收敛方案后做了全链路验证:dig解析出源站真实 IP、存活探针返回"I'm alive!"、模型列表能拉到 gemini 系列 ID、聊天推理返回 token 统计,最后 Codex 客户端联调稳定。走 TaoToken 这条通道时,对应验证会更简洁:Codex 能持续输出完整的排障分析,没有在长对话中途因为模型调用失败而丢上下文。你在本地执行完 Kong 配置调整后,Codex 的总结结论应该和原文一致:DNS-Only 模式下,31850 端口透明可达,522 和 524 都不再由 Cloudflare 边缘触发。
6. 回到 TaoToken 官网核对该 Key 的排障消耗
跑完一轮完整排障后,我建议你顺手打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 看一眼这个 Key 的用量记录。核对目标不是纠结 token 数,而是确认 Codex 在刚才那几次长分析里确实稳定地通过 TaoToken 完成了模型调用,并且每次消耗都能在账面上对应到具体对话。这样后续再让 Codex 帮你查方案 2B 的 OCI Load Balancer 证书链路时,心里也有底:模型通道不会再成为排障中断的原因。
这条排障链路里,TaoToken 的角色是给 Codex 提供稳定的模型能力,Cloudflare 和 LiteLLM 的架构决策仍然由你按照原文的方案对比来推进。先把模型通道稳定住,再回头处理网关回源,这也是我这次实际用的顺序。