0、前言

本文整理自我在配置远程服务器 Codex CLI 与 VSCode Codex 扩展过程中,与 AI 助手多轮排查、反复试错后的聊天记录。由于服务器无外网、无 root 权限,同时还涉及本地代理、SSH 反向端口转发、VSCode Remote 环境变量、CA 证书、Codex 登录状态与扩展通信等多个环节,整个过程并不是简单照抄几条命令就能完成的。本文的价值不在于提供一套“保证一次成功”的固定脚本,而是从实际排错过程中总结出关键配置流程、核心检查方法和常见问题的解决思路。

需要特别说明的是,我最终虽然配置成功了,但并没有严格按照本文整理后的顺序重新从零验证一遍。因此,读者如果完全照着本文逐步操作,仍然很可能遇到与我不同的错误。更推荐的使用方式是:将本文作为一份“问题地图”和“排错线索”,配合 ChatGPT、Claude、Copilot 或其他 AI 工具一起使用,把自己的终端输出、报错信息和当前环境告诉 AI,让它结合本文中的关键逻辑进行针对性判断。实践上,建议优先把 Codex CLI 跑通,再去配置 VSCode Codex 扩展;CLI 能验证代理、登录、证书和后端通信是否正常,插件问题也会更容易定位,这样会事半功倍。

1. 整体思路

本地 Windows 已有代理服务,例如:

127.0.0.1:7890

远程服务器没有外网,也没有 root 权限,因此通过 SSH 反向代理,把本地代理映射到远程服务器:

远程服务器 127.0.0.1:17891  →  本地电脑 127.0.0.1:7890

之后让远程服务器上的 Codex CLI 和 VSCode Codex 扩展都走:

http://127.0.0.1:17891

2. 本地 SSH 配置反向代理

在 Windows 本地 SSH 配置文件中加入:

Host NF5468M6
    HostName 服务器地址
    User group2
    RemoteForward 17891 127.0.0.1:7890
    ServerAliveInterval 30
    ServerAliveCountMax 3

然后用 VSCode Remote-SSH 重新连接服务器。

连接后,在远程服务器测试端口是否可达:

python - <<'PY'
import socket
try:
    s = socket.create_connection(("127.0.0.1", 17891), timeout=5)
    print("OK: remote 127.0.0.1:17891 is reachable")
    s.close()
except Exception as e:
    print("FAILED:", repr(e))
PY

3. 准备 CA 证书文件

如果远程服务器缺少系统 CA,Codex 可能报:

no native root CA certificates found

可直接使用 conda / Python 环境中的 certifi 证书:

mkdir -p ~/.codex/certs

CERT=$(python - <<'PY'
import certifi
print(certifi.where())
PY
)

cp "$CERT" ~/.codex/certs/cacert.pem
chmod 600 ~/.codex/certs/cacert.pem

test -s ~/.codex/certs/cacert.pem && echo "CA 文件已就绪"

4. 配置远程环境变量

创建统一环境变量文件:

cat > ~/.codex/remote-env.sh <<'EOF'
export HTTP_PROXY="http://127.0.0.1:17891"
export HTTPS_PROXY="http://127.0.0.1:17891"
export http_proxy="http://127.0.0.1:17891"
export https_proxy="http://127.0.0.1:17891"

export WS_PROXY="http://127.0.0.1:17891"
export WSS_PROXY="http://127.0.0.1:17891"
export ws_proxy="http://127.0.0.1:17891"
export wss_proxy="http://127.0.0.1:17891"

export NO_PROXY="localhost,127.0.0.1,::1"
export no_proxy="localhost,127.0.0.1,::1"

export SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export OPENSSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export REQUESTS_CA_BUNDLE="$HOME/.codex/certs/cacert.pem"
export CURL_CA_BUNDLE="$HOME/.codex/certs/cacert.pem"
export NODE_EXTRA_CA_CERTS="$HOME/.codex/certs/cacert.pem"
export NIX_SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"

export PATH="$HOME/bin:$HOME/.local/bin:$PATH"
EOF

chmod 600 ~/.codex/remote-env.sh

将其写入 shell 启动文件。建议放在 .bashrc 最前面:

cp ~/.bashrc ~/.bashrc.bak.$(date +%Y%m%d_%H%M%S)

grep -v 'remote-env.sh' ~/.bashrc > ~/.bashrc.tmp

{
  echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"'
  cat ~/.bashrc.tmp
} > ~/.bashrc

rm ~/.bashrc.tmp

grep -q 'remote-env.sh' ~/.profile 2>/dev/null || \
echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"' >> ~/.profile

grep -q 'remote-env.sh' ~/.bash_profile 2>/dev/null || \
echo '[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"' >> ~/.bash_profile

测试是否生效:

bash -lc 'env | grep -Ei "proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY"'

5. 配置 Codex CLI

如果 Codex CLI 已经安装在远程服务器,例如:

/home/Groups/group2/.local/bin/codex

如果没有安装可以本地下载安装包上传到服务器再进行本地安装,网上的帖子很多,这里本文不做赘述。

可以创建包装脚本,保证每次运行都带代理和证书环境:

mkdir -p ~/bin

cat > ~/bin/codex <<'EOF'
#!/usr/bin/env bash

[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"

exec "$HOME/.local/bin/codex" "$@"
EOF

chmod +x ~/bin/codex

确保优先使用包装脚本:

echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

which codex
type -a codex

运行:

codex

6. 配置 VSCode Codex 扩展

创建 VSCode Server 环境配置文件:

mkdir -p ~/.vscode-server

cat > ~/.vscode-server/server-env-setup <<'EOF'
#!/bin/sh

[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"
EOF

chmod +x ~/.vscode-server/server-env-setup

然后在本地 VSCode 中执行:

Ctrl + Shift + P
Remote-SSH: Kill VS Code Server on Host...

重新连接服务器。

连接后检查 VSCode 远程扩展进程是否继承变量:

for pid in $(pgrep -u "$USER" -f extensionHost); do
  echo "===== extensionHost PID=$pid ====="
  cat /proc/$pid/environ | tr '\0' '\n' | grep -Ei 'proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY|PATH'
done

需要看到类似内容:

HTTP_PROXY=http://127.0.0.1:17891
HTTPS_PROXY=http://127.0.0.1:17891
SSL_CERT_FILE=/home/Groups/group2/.codex/certs/cacert.pem
NODE_EXTRA_CA_CERTS=/home/Groups/group2/.codex/certs/cacert.pem
WSS_PROXY=http://127.0.0.1:17891

确认后再使用 VSCode Codex 扩展。


关键问题与解决方案

1. 远程服务器没有外网

问题表现:

error sending request for url
connection timed out

解决方案:

使用 SSH 反向代理:

RemoteForward 17891 127.0.0.1:7890

远程统一走:

http://127.0.0.1:17891

2. 代理端口可达,但 Codex 仍然报错

问题表现:

stream disconnected before completion
error sending request for url

原因通常不是端口问题,而是 Codex 子进程没有继承代理或证书变量。

解决方案:

检查 extensionHost 环境:

cat /proc/$(pgrep -u "$USER" -f extensionHost | head -n1)/environ \
| tr '\0' '\n' \
| grep -Ei 'proxy|SSL|CERT|NODE_EXTRA'

如果只有 HTTP_PROXY / HTTPS_PROXY,没有 SSL_CERT_FILE / NODE_EXTRA_CA_CERTS,需要重新配置远程环境变量并重启 VSCode Server。


3. 远程服务器缺少系统 CA 证书

问题表现:

no native root CA certificates found

解决方案:

使用 Python certifi 证书:

mkdir -p ~/.codex/certs

CERT=$(python - <<'PY'
import certifi
print(certifi.where())
PY
)

cp "$CERT" ~/.codex/certs/cacert.pem
chmod 600 ~/.codex/certs/cacert.pem

然后设置:

export SSL_CERT_FILE="$HOME/.codex/certs/cacert.pem"
export NODE_EXTRA_CA_CERTS="$HOME/.codex/certs/cacert.pem"

4. CLI 可以用,但 VSCode 扩展不能用

原因:

CLI 运行在当前 shell 中,可以读取 .bashrc;VSCode 扩展运行在远程 extensionHost 中,不一定继承当前终端环境。

解决方案:

同时配置:

~/.codex/remote-env.sh
~/.bashrc
~/.profile
~/.bash_profile
~/.vscode-server/server-env-setup

然后必须执行:

Remote-SSH: Kill VS Code Server on Host...

再重新连接。


5. 包装脚本路径写错

错误写法:

exec /home/Groups/group2/.codex/bin/codex "$@"

如果实际 Codex 在:

/home/Groups/group2/.local/bin/codex

应改为:

exec "$HOME/.local/bin/codex" "$@"

否则会报:

No such file or directory

6. server-env-setup 不一定单独生效

如果重连后 extensionHost 仍然没有 CA 变量,说明 VSCode Server 没有正确读取该文件。

解决方案:

把环境变量也写入 .bashrc 最顶部,而不是只依赖:

~/.vscode-server/server-env-setup

关键是 .bashrc 顶部要有:

[ -f "$HOME/.codex/remote-env.sh" ] && . "$HOME/.codex/remote-env.sh"

不要放到底部,因为很多服务器的 .bashrc 中间会对非交互 shell 提前 return


7. 登录成功后仍出现 codex/responses 报错

问题表现:

stream disconnected before completion: error sending request for url (https://chatgpt.com/backend-api/codex/responses)

排查顺序:

  1. 确认远程 127.0.0.1:17891 可达;
  2. 确认代理能访问 https://www.google.comhttps://api.openai.com/v1/models
  3. 确认 extensionHost 进程包含代理变量;
  4. 确认 extensionHost 进程包含 CA 变量;
  5. Kill VSCode Server 后重新连接;
  6. 再打开 Codex 扩展测试。

核心判断:

for pid in $(pgrep -u "$USER" -f extensionHost); do
  echo "===== extensionHost PID=$pid ====="
  cat /proc/$pid/environ | tr '\0' '\n' | grep -Ei 'proxy|SSL|CERT|CA_BUNDLE|NODE_EXTRA|NIX_SSL|WS_PROXY|WSS_PROXY|PATH'
done

只要 extensionHost 同时继承代理变量和 CA 变量,VSCode Codex 扩展才有较大概率正常工作。

参考博客

[1] 傻瓜式完全解决!在远程服务器上使用codex、vscode辅助
[2] 通过VS code远程连接服务器使用codex
[3] 在 VS Code Remote SSH 中为 Codex 扩展配置远程代理教程
[4] CodeX在Vscode中与服务器不适配的Bug
[5] VS Code Remote-SSH: Codex extension stuck on “Thinking”
[6] 如何在服务器上使用Codex
[7] 服务器反向代理+vscode+ssh+服务器登陆codex cli
[8] VSCode远程连接服务器Codex无法登录+成功登录后一直thinking状态

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐