背景
在 Windows 本机使用 Codex 时,Codex CLI 经常出现反复重连:
reconnecting 5 times
本机访问外网需要经过本地代理,代理由 v2rayN / xray 提供,HTTP 代理端口是:
127.0.0.1:10808
一开始尝试过全局设置 HTTP_PROXY / HTTPS_PROXY,但会影响 Codex App 的用量查看、插件等功能。因此最终目标是:只让 Codex CLI 稳定走代理,不污染系统全局代理,也尽量不影响 Codex App。
基础环境
项目 |
说明 |
|---|
操作系统 |
Windows |
终端 |
PowerShell |
工具 |
Codex App、Codex CLI |
本地代理 |
v2rayN / xray |
代理地址 |
http://127.0.0.1:10808 |
Codex 配置目录 |
C:\Users\15564\.codex |
最终配置文件 |
C:\Users\15564\.codex\.env |
解决方案
最终方案是在 Codex 配置根目录新增 .env 文件:
C:\Users\15564\.codex\.env
文件内容:
HTTP_PROXY=http://127.0.0.1:10808
HTTPS_PROXY=http://127.0.0.1:10808
ALL_PROXY=http://127.0.0.1:10808
NO_PROXY=localhost,127.0.0.1,::1
注意:HTTPS_PROXY 这里也写 http://127.0.0.1:10808,表示通过本地 HTTP 代理转发 HTTPS 请求,不是写成 https://127.0.0.1:10808。
这个方案的好处:
- 不改 Windows 系统全局代理。
- 不影响 Codex App 的用量和插件功能。
- 不需要额外维护 PowerShell 包装函数。
- Codex CLI 启动后能自动读取自己的代理环境。
排查问题及解决过程
这次没有直接重装 Codex,也没有先改系统全局代理,而是先确认问题到底出在 Codex CLI 连接链路上。
1. 确认本地代理可用
先检查本机代理端口是否正常监听:
Get-NetTCPConnection -LocalPort 10808 -ErrorAction SilentlyContinue
确认 127.0.0.1:10808 处于监听状态,并且监听进程是 xray。这说明本地代理本身是可用的,问题更可能是 Codex CLI 没有正确使用代理。
2. 确认 Codex CLI 没有独立代理参数
再查看 Codex CLI 的帮助信息:
codex --help
当时确认 Codex CLI 没有单独的 --proxy 参数,所以不能通过命令参数直接指定代理,只能通过环境变量处理。
3. 临时注入代理验证
先在当前 PowerShell 会话临时注入代理环境变量:
$env:HTTP_PROXY = "http://127.0.0.1:10808"
$env:HTTPS_PROXY = "http://127.0.0.1:10808"
$env:ALL_PROXY = "http://127.0.0.1:10808"
$env:NO_PROXY = "localhost,127.0.0.1,::1"
codex doctor --summary --ascii --no-color
这一步验证通过后,websocket 和 reachability 都正常,说明 reconnecting 5 times 的核心原因就是 Codex CLI 没有稳定走本机 HTTP 代理。
4. 固化为 .env 配置
临时环境变量只能影响当前 PowerShell 会话,不能作为长期方案。中间曾用过 codexp PowerShell 包装函数临时解决。
codexp 的思路是:执行 Codex CLI 前先设置代理环境变量,执行结束后再恢复原来的环境变量。这样可以做到只影响 Codex CLI 子进程,不改 Windows 全局代理。
示例逻辑如下:
function codexp {
$oldHttpProxy = $env:HTTP_PROXY
$oldHttpsProxy = $env:HTTPS_PROXY
$oldAllProxy = $env:ALL_PROXY
$oldNoProxy = $env:NO_PROXY
try {
$env:HTTP_PROXY = "http://127.0.0.1:10808"
$env:HTTPS_PROXY = "http://127.0.0.1:10808"
$env:ALL_PROXY = "http://127.0.0.1:10808"
$env:NO_PROXY = "localhost,127.0.0.1,::1"
codex @args
} finally {
$env:HTTP_PROXY = $oldHttpProxy
$env:HTTPS_PROXY = $oldHttpsProxy
$env:ALL_PROXY = $oldAllProxy
$env:NO_PROXY = $oldNoProxy
}
}
使用方式:
codexp doctor --summary --ascii --no-color
当时验证结果正常,说明“只给 Codex CLI 子进程注入代理”的方向是可行的。但这个方案依赖 PowerShell profile,换终端或换启动方式时不一定生效,而且还需要记住使用 codexp 而不是 codex。
最终改为把代理变量写入:
C:\Users\15564\.codex\.env
这样 Codex CLI 能自动读取配置,不需要每次手动设置,也不会影响系统全局代理。
验证方式
配置完成后,重启 Codex CLI,执行:
codex doctor --summary --ascii --no-color
重点看:
websocket ok
reachability ok
如果 websocket 和 reachability 正常,并且不再出现 reconnecting 5 times,说明配置生效。
回滚方式
如果后续网络环境变化,不再需要本地代理,删除或重命名这个文件即可:
C:\Users\15564\.codex\.env
然后重启 Codex CLI,再执行 codex doctor 验证。
结论
这次问题的根因是 Codex CLI 没有稳定走本机 HTTP 代理。最终通过 C:\Users\15564\.codex\.env 固定代理环境变量,解决了 CLI 重连 5 次的问题,同时避免了全局代理影响 Codex App。