直接访问 http://服务器ip:8888 失败是因为 jupyter 默认仅监听 localhost,需将 c.notebookapp.ip 设为 '0.0.0.0' 并启用 c.notebookapp.allow_remote_access = true,配合 ssh 隧道或防火墙放行方可远程访问。

为什么直接访问 http://服务器IP:8888 会失败
默认安装的 Jupyter Notebook 只监听 localhost(即 127.0.0.1),外部请求根本进不来。这不是浏览器或网络问题,是服务端根本没开放对外接口。常见报错包括连接被拒绝、ERR_CONNECTION_REFUSED,或者浏览器卡在加载状态——本质都是因为 c.NotebookApp.ip 没改对。
c.NotebookApp.ip 应该设成 '0.0.0.0' 而不是 '*'
虽然文档里写 '*' 看似通用,但实际在多数 Linux 发行版(尤其是 Ubuntu 22.04+、CentOS 8+)上会触发绑定失败,日志里出现 Cannot assign requested address。必须用 '0.0.0.0' 才能真正监听所有网卡。
-
c.NotebookApp.ip = '0.0.0.0':明确告诉内核监听所有 IPv4 接口 -
c.NotebookApp.allow_remote_access = True:这个开关必须显式开启,否则即使绑定了0.0.0.0,Jupyter 也会主动拒绝非本地请求 - 别漏掉
c.NotebookApp.open_browser = False:服务器没桌面环境,开浏览器必然失败并卡住启动流程
密码设置别用 passwd() 手动拼字符串
手动调 from notebook.auth import passwd; passwd() 生成的 sha1:xxx 或 argon2:xxx 字符串,容易复制不全、粘贴错位,导致登录页一直提示“Invalid token”。更稳的方式是直接运行:
jupyter notebook password
它会把加密后的密码自动写入 ~/.jupyter/jupyter_server_config.json,无需你碰任何配置文件。只要确保后续没在 jupyter_notebook_config.py 里用 c.NotebookApp.password 覆盖它就行。
- 执行该命令时,终端会提示输入两次密码,成功后无输出——这是正常现象
- 如果之前手动写过
c.NotebookApp.password,建议删掉那一行,避免冲突 - 密码生效前提是
jupyter notebook启动时读的是jupyter_server_config.json(默认行为),而不是只认.py配置
SSH 隧道命令里 localhost:8888 的顺序不能颠倒
本地连远程 Jupyter 最安全的方式是 SSH 端口转发,但很多人写错格式导致映射无效:
ssh -N -L 8888:localhost:8888 user@server_ip
这里 8888(左)是本地端口,localhost:8888(右)是服务器上的目标地址——注意是服务器自己的 localhost,不是你的本地机。如果服务器 Jupyter 实际跑在 127.0.0.1:8890,右边就得写 localhost:8890。
- 别写成
8888:server_ip:8888:Jupyter 默认不监听外网 IP,连自己服务器的公网 IP 都不通 - 加
-f参数可让 SSH 后台运行:ssh -f -N -L 8888:localhost:8888 user@server_ip - 连不上时先在服务器上执行
jupyter notebook list,确认服务确实在运行且端口匹配
ufw 或 firewalld 没放行;allow_root 这种参数只在 root 下启动时才需要加,普通用户完全不用碰。











