vscode 远程连接 jupyter 内核失败主因是协议不匹配或配置错误:须用 jupyter server(非 notebook)并启用 --serverapp.allow_remote_access=true;uri 必须含有效 token 且指向远程 ip 或 ssh 隧道 localhost;内核需在远程预装并校验路径。

VSCode 连接远程 Jupyter 内核时 jupyter_server 启动失败
远程内核连不上,90% 是因为本地 VSCode 试图用 jupyter notebook 协议去连一个只跑着 jupyter_server(或 jupyter lab)的后端。VSCode 自 1.8x 起默认依赖 jupyter_server,而非旧版 notebook。
- 确认远程服务器已安装
jupyter_server:pip show jupyter-server,不是jupyter-notebook - 启动服务时必须显式指定
--ServerApp.allow_remote_access=True,否则即使端口开放也会被拒绝 - 别用
jupyter notebook --port=8888启动——它不兼容 VSCode 新内核协议,会报404 /api/sessions或连接后立即断开 - 推荐启动命令:
jupyter server --port=8888 --no-browser --allow-root --ServerApp.allow_remote_access=True --ServerApp.token='' --ServerApp.password=''
VSCode 中选择远程内核时找不到 Python 3 (jupyter-server)
不是“没加载出来”,而是 VSCode 根本没识别到远程服务——它不会自动扫描 IP 或端口,必须手动填入有效连接信息。
- 先在远程服务器上运行
jupyter server list,拿到类似http://127.0.0.1:8888/?token=abc123...的完整 URL - VSCode 中按
Ctrl+Shift+P→ 输入Jupyter: Specify Jupyter Server URI→ 粘贴上面的完整 URL(含token参数) - 如果 URL 是
http://localhost:8888,本地 VSCode 会尝试连自己本机,必须改成服务器真实 IP(如http://192.168.1.100:8888) - 若远程用了反向代理(如 Nginx),确保代理透传了 WebSocket 升级头(
Upgrade,Connection),否则内核连接会卡在 pending
远程内核能连上但执行单元格报 Kernel died, restarting
这不是网络问题,是远程 Python 环境和内核路径不一致导致的典型崩溃。VSCode 会把本地选中的 Python 解释器路径发给远程,但它可能根本不存在于远端。
- 不要在本地 VSCode 中直接选 “Python 3.11” 这类带版本号的解释器——它指向的是你本机路径,远程没有意义
- 务必在远程服务器上提前创建好可用的 kernel:运行
python -m ipykernel install --user --name myenv --display-name "Python (myenv)" - 重启远程
jupyter server后,在 VSCode 的内核选择器里找带(myenv)的那一项,而不是“Python 3”默认项 - 检查远程
~/.local/share/jupyter/kernels/myenv/kernel.json,确认argv[0]指向的是远程真实的 Python 可执行路径(如/home/user/miniconda3/envs/myenv/bin/python)
SSH 隧道方式连接比直连更稳,但容易配错端口转发
绕过防火墙或公司网络策略时,SSH 隧道是最可靠的方式,但很多人把本地端口、远程端口、服务绑定端口三者搞混。
- 远程
jupyter server必须绑定到--ip=0.0.0.0(不能是127.0.0.1),否则 SSH 隧道无法中转 - 正确隧道命令:
ssh -L 8888:localhost:8888 user@remote-ip—— 注意中间是localhost,不是远程 IP - VSCode 中填的 URI 是
http://localhost:8888/?token=xxx,不是远程地址 - 如果远程 jupyter 绑定在
0.0.0.0:9999,隧道就得写成ssh -L 8888:localhost:9999 ...,然后 URI 用http://localhost:8888/...,本地端口和远程服务端口可以不同
真正麻烦的从来不是连上,而是 kernel 启动后加载不到远端环境里的包,或者 token 过期没刷新。每次换环境,先 jupyter server list 看一眼 token 和 URL 是否还有效,比反复重启 server 实在得多。











