免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

远程服务器Jupyter配置实战:从SSH隧道到Nginx反向代理

远程服务器Jupyter配置实战:从SSH隧道到Nginx反向代理 1. 项目概述为什么要在远程服务器上折腾Jupyter如果你和我一样经常需要处理数据量大的分析任务或者模型训练需要更强的GPU那么本地电脑很快就会显得力不从心。这时候把Jupyter Notebook搬到远程服务器上就成了一个自然而然的选择。这不仅仅是换个地方跑代码它意味着你可以随时随地从任何一台能上网的电脑访问一个拥有强大计算资源、固定环境、且数据集中存储的工作空间。想象一下你在家里的笔记本上开始一个数据分析出门后用平板电脑接着写到了公司用台式机继续调试模型所有代码、中间变量和运行状态都原封不动地保留在云端服务器上这种无缝衔接的体验才是远程Jupyter的核心魅力。然而理想很丰满现实往往是一地鸡毛。“配置”二字听起来简单但真正操作起来从网络设置、安全策略到环境依赖每一步都可能藏着意想不到的坑。网上的教程很多但要么过于简略跳过了关键细节要么环境差异太大导致照搬失败。我这次配置的过程可以说是一路“踩坑”填过来的从SSH隧道端口的纠结到Web服务器配置的权限陷阱再到虚拟环境与内核的“失联”问题每一个坑都耗费了不少时间。所以我决定把这次完整的、充满细节包括那些令人头疼的错误的配置经历记录下来。这不是一个冷冰冰的官方文档而是一个实战派从业者的踩坑复盘目标就是让你看完之后能一次性成功配置好自己的远程Jupyter Lab/Notebook并把那些常见雷区都提前标记清楚。2. 核心思路与方案选型不止一种连接方式在开始动手之前我们需要理清几种常见的远程访问Jupyter的方案理解它们的原理和适用场景这能帮你做出最适合自己情况的选择。2.1 方案对比SSH隧道 vs. 反向代理 vs. 直接暴露1. SSH端口转发隧道这是最经典、也最推荐给个人用户和小团队使用的方法。其核心原理是利用SSH协议的安全通道将远程服务器上Jupyter服务的某个端口如8888映射到你本地电脑的一个端口如本地8889。命令示例ssh -L 8889:localhost:8888 useryour_server_ip工作流程你在本地浏览器访问http://localhost:8889流量通过加密的SSH隧道传递到远程服务器的localhost:8888即Jupyter服务本身。服务器上的Jupyter只需要绑定到127.0.0.1本地回环地址无需对公网开放。优点安全性极高所有流量经过SSH加密无需在服务器配置复杂的Web服务器或SSL证书配置简单一条命令即可。缺点需要保持SSH连接不断开不适合需要让多人直接通过浏览器访问的场景。适用场景个人开发、数据分析、模型训练你作为唯一或主要使用者。2. 通过Web服务器如Nginx反向代理这种方法适合团队协作或需要提供稳定访问入口的场景。你在服务器上安装Nginx或Apache将其配置为一个反向代理对外提供HTTPS访问并将请求转发给后台运行的Jupyter服务。工作流程Jupyter服务在后台运行通常用systemd守护进程。Nginx监听80/443端口配置规则将特定域名如jupyter.yourdomain.com的请求转发到Jupyter服务的本地端口如127.0.0.1:8888。优点支持HTTPS更安全专业可以配置域名易于记忆和访问方便设置访问控制、负载均衡连接稳定不受SSH断开影响。缺点配置步骤较多涉及Web服务器和SSL证书需要你拥有一个域名。适用场景小团队共享计算资源、教学环境、需要提供固定访问地址的服务。3. 直接修改Jupyter配置对外暴露极其不推荐有些教程会教你修改Jupyter配置让其监听0.0.0.0所有网络接口并设置密码。强烈不建议这样做。因为这相当于将你的Jupyter服务直接暴露在公网上虽然设置了密码但依然面临被暴力破解、中间人攻击等安全风险。Jupyter本身并非为直接面向公网设计其认证机制相对薄弱。安全提示除非在绝对可控的内网环境否则永远不要让Jupyter服务监听0.0.0.0。我们的所有方案都基于让服务只运行在本地127.0.0.1然后通过SSH或反向代理这种更安全的方式来访问。我的选择对于绝大多数个人和需要高强度交互式编程的场景SSH隧道方案是首选。它完美平衡了安全性、便捷性和功能性。本文后续的详细配置也将以SSH隧道方案为主线并在最后简要介绍如何升级到Nginx反向代理方案以满足更进阶的需求。2.2 基础环境准备服务器与本地在开始配置Jupyter之前我们需要确保服务器和本地环境就绪。服务器端以Ubuntu 20.04/22.04 LTS为例系统更新首先通过SSH登录你的远程服务器执行sudo apt update sudo apt upgrade -y更新系统包。安装Python和pip确保已安装Python3和pip。sudo apt install python3 python3-pip -y。可选但推荐创建虚拟环境为了避免污染系统Python环境强烈建议为Jupyter创建独立的虚拟环境。sudo apt install python3-venv -y # 安装venv模块 python3 -m venv ~/jupyter_env # 在用户目录下创建虚拟环境 source ~/jupyter_env/bin/activate # 激活环境激活后命令行提示符前会出现(jupyter_env)字样。本地端SSH客户端确保你本地有SSH客户端。Linux/macOS系统自带Windows 10及以上版本通常也内置了OpenSSH客户端可以在PowerShell或CMD中直接使用ssh命令。如果不行可以安装Git Bash或使用MobaXterm、PuTTY等第三方工具。浏览器任何现代浏览器即可。3. 服务器端Jupyter配置详解这是整个流程的核心部分我们将一步步安装、配置并启动Jupyter服务。3.1 安装Jupyter Lab/Notebook在服务器的虚拟环境如果创建了中使用pip进行安装。我更喜欢Jupyter Lab因为它提供了更现代化的界面和模块化布局但传统Notebook的安装和配置流程几乎一致。# 确保处于虚拟环境中然后升级pip并安装 pip install --upgrade pip pip install jupyterlab # 如果想安装经典Notebook可以加上 jupyter notebook但Lab已包含Notebook功能。安装完成后可以验证一下jupyter --version。3.2 生成Jupyter配置文件与密码Jupyter允许深度自定义其配置存储在一个JSON文件中。我们首先生成这个配置文件。jupyter notebook --generate-config这条命令会在~/.jupyter/目录下生成一个名为jupyter_notebook_config.py的配置文件。接下来设置访问密码。这是关键的安全步骤即使通过SSH隧道我们也希望有密码保护防止本地电脑被他人使用时误操作。jupyter notebook password执行后它会提示你输入密码并确认。这个密码会被加密并存储在~/.jupyter/jupyter_notebook_config.json中。请务必记住这个密码。3.3 关键配置文件修改现在我们来编辑之前生成的配置文件~/.jupyter/jupyter_notebook_config.py。使用你熟悉的文本编辑器如nano或vim。nano ~/.jupyter/jupyter_notebook_config.py我们需要找到并修改以下几行使用CtrlW在nano中搜索设置监听地址找到#c.ServerApp.ip localhost取消注释并将其改为c.ServerApp.ip 127.0.0.1这确保Jupyter只监听本地回环地址不对外网开放。设置监听端口找到#c.ServerApp.port 8888可以取消注释并保留8888也可以改为其他未被占用的端口比如c.ServerApp.port 8889。记住这个端口号后续SSH隧道会用到。禁止自动打开浏览器在服务器上我们不需要浏览器。找到#c.ServerApp.open_browser True取消注释并改为c.ServerApp.open_browser False设置工作目录找到#c.ServerApp.notebook_dir 取消注释并设置为你希望存放Notebook文件的目录例如c.ServerApp.notebook_dir /home/your_username/jupyter_workspace请确保该目录存在且你有读写权限mkdir -p ~/jupyter_workspace。允许远程连接这是一个容易混淆的设置。它的本意是“允许来自非本地host的连接请求”。因为我们通过SSH隧道访问对于Jupyter服务来说请求来源是127.0.0.1隧道入口所以需要允许。找到#c.ServerApp.allow_remote_access False取消注释并改为c.ServerApp.allow_remote_access True保存并退出编辑器在nano中是CtrlX然后按Y确认再按Enter。3.4 启动Jupyter服务配置完成后我们就可以启动Jupyter服务了。建议在后台运行这样即使关闭SSH会话服务也不会停止。我们可以使用nohup配合或者更好的方式是使用screen/tmux这类终端复用器。方法一使用nohup简单cd ~/jupyter_workspace # 进入工作目录 nohup jupyter lab --config ~/.jupyter/jupyter_notebook_config.py ~/jupyter.log 21 nohup使命令忽略挂断信号在终端关闭后继续运行。 ~/jupyter.log 21将标准输出和错误输出都重定向到~/jupyter.log文件方便查看日志。在后台运行。 启动后可以使用tail -f ~/jupyter.log查看启动日志确认服务是否在指定端口成功运行。方法二使用systemd专业推荐对于长期运行的服务使用systemd管理是最佳实践。它可以实现开机自启、自动重启、集中日志管理等。创建服务文件sudo nano /etc/systemd/system/jupyter.service写入以下内容请根据你的实际路径修改[Unit] DescriptionJupyter Lab Service Afternetwork.target [Service] Typesimple Useryour_username # 替换为你的用户名 WorkingDirectory/home/your_username/jupyter_workspace EnvironmentPATH/home/your_username/jupyter_env/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ExecStart/home/your_username/jupyter_env/bin/jupyter lab --config/home/your_username/.jupyter/jupyter_notebook_config.py Restartalways RestartSec10 [Install] WantedBymulti-user.target关键点1EnvironmentPATH...这里必须包含你的虚拟环境的bin目录路径否则systemd会找不到jupyter命令。这是最常见的坑之一。关键点2User务必指定运行服务的用户避免权限问题。保存退出后重新加载systemd并启动服务sudo systemctl daemon-reload sudo systemctl start jupyter sudo systemctl enable jupyter # 设置开机自启检查状态和日志sudo systemctl status jupyter sudo journalctl -u jupyter -f # 实时查看日志4. 本地连接建立SSH隧道与访问服务器端服务跑起来后下一步就是从本地连接了。4.1 建立SSH隧道打开你本地的终端Windows PowerShell/CMD macOS/Linux Terminal执行以下命令ssh -N -L localhost:8889:localhost:8888 your_usernameyour_server_ip-N表示不执行远程命令仅用于端口转发。-L localhost:8889:localhost:8888这是端口转发的核心参数。意思是“将本地的8889端口通过SSH隧道转发到远程服务器的localhost:8888端口”。第一个localhost指本地机器第二个localhost指远程服务器。注意这里的8888必须与你在服务器jupyter_notebook_config.py中设置的c.ServerApp.port完全一致。your_usernameyour_server_ip你的服务器登录信息。执行后会提示输入服务器密码如果配置了SSH密钥对则无需密码。输入后这个终端窗口就会挂起表示隧道正在运行。不要关闭这个窗口。4.2 访问Jupyter Lab保持SSH隧道终端运行打开你本地的浏览器在地址栏输入http://localhost:8889如果一切配置正确你将看到Jupyter Lab的登录页面。输入之前在服务器上用jupyter notebook password设置的密码即可进入熟悉的Jupyter Lab界面。恭喜至此最基本的远程Jupyter配置已经成功。5. 进阶配置与深度优化基础功能通了但要想用得顺手、稳定、高效还需要一些进阶配置。5.1 虚拟环境与Jupyter内核关联如果你在虚拟环境中安装了Jupyter但启动后发现无法在Notebook中选择该环境或者导入的包还是系统环境的那是因为Jupyter内核Kernel没有与虚拟环境关联。解决方法将虚拟环境注册为Jupyter内核。首先激活你的虚拟环境source ~/jupyter_env/bin/activate。安装ipykernelpip install ipykernel。将当前环境添加到Jupyter内核列表python -m ipykernel install --user --namejupyter_env --display-namePython (My Jupyter Env)--name内核的内部标识符。--display-name在Jupyter界面中显示的名称。完成后重启Jupyter服务sudo systemctl restart jupyter刷新浏览器页面。在新建Notebook时你应该能看到“Python (My Jupyter Env)”这个新内核选项。5.2 使用Nginx反向代理提供HTTPS访问如果你需要更稳定、更专业的访问方式比如通过域名访问或者团队共享可以配置Nginx反向代理。安装Nginxsudo apt install nginx -y配置SSL证书可以使用Let‘s Encrypt的免费证书。安装Certbotsudo apt install certbot python3-certbot-nginx -y然后为你的域名申请证书sudo certbot --nginx -d jupyter.yourdomain.com。按照提示操作即可。配置Nginx站点创建一个新的配置文件例如sudo nano /etc/nginx/sites-available/jupyter。server { listen 80; server_name jupyter.yourdomain.com; # 你的域名 return 301 https://$server_name$request_uri; # 强制跳转HTTPS } server { listen 443 ssl http2; server_name jupyter.yourdomain.com; ssl_certificate /etc/letsencrypt/live/jupyter.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jupyter.yourdomain.com/privkey.pem; # 其他SSL优化配置可以酌情添加 location / { proxy_pass http://127.0.0.1:8888; # 指向Jupyter服务端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket支持对于Jupyter Lab的实时功能很重要 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 86400; # 长连接超时设置 } }启用配置并重启Nginxsudo ln -s /etc/nginx/sites-available/jupyter /etc/nginx/sites-enabled/ sudo nginx -t # 测试配置语法 sudo systemctl reload nginx修改Jupyter配置为了让Jupyter信任来自Nginx的反向代理需要在jupyter_notebook_config.py中添加c.ServerApp.allow_origin https://jupyter.yourdomain.com # 你的域名 c.ServerApp.tornado_settings { headers: { Content-Security-Policy: frame-ancestors self https://jupyter.yourdomain.com } }重启Jupyter服务。现在你和你的团队成员就可以直接通过https://jupyter.yourdomain.com访问输入密码即可使用无需再建立SSH隧道。5.3 配置Jupyter Lab扩展Jupyter Lab的强大之处在于其丰富的扩展。安装和管理扩展也很简单。确保已安装Node.js12.0.0和npm。sudo apt install nodejs npm -y。安装扩展管理器如果未安装pip install jupyterlab-lsp这是一个带管理功能的流行扩展或者直接pip install jupyterlab通常已包含。在Jupyter Lab界面左侧点击拼图图标进入扩展管理器搜索并安装你需要的扩展如jupyterlab/toc目录生成、jupyter-widgets/jupyterlab-manager交互式控件支持等。或者通过命令行安装jupyter labextension install jupyterlab/toc。6. 常见问题与故障排查实录在实际操作中你几乎一定会遇到一些问题。下面是我踩过或见过的坑及其解决方案。6.1 连接问题排查表问题现象可能原因排查步骤与解决方案浏览器访问localhost:8889无法连接1. SSH隧道未成功建立。2. 本地端口被占用。3. 服务器防火墙阻止了SSH连接或转发。1. 检查SSH命令是否执行成功有无错误信息。尝试去掉-N参数看是否能登录服务器。2. 换一个本地端口如-L 8890:localhost:8888。3. 检查服务器防火墙如ufwsudo ufw status。确保SSH端口默认22是开放的。对于云服务器还需检查安全组/网络ACL规则。连接后提示“密码不正确”或直接进入无密码界面1. 密码未正确设置或配置文件未生效。2. 浏览器缓存了旧的登录信息。1. 确认执行过jupyter notebook password。检查~/.jupyter/jupyter_notebook_config.json文件是否存在且内容正常。重启Jupyter服务。2. 使用浏览器无痕模式访问或清除浏览器缓存。Jupyter服务启动失败日志报错Port already in use指定的端口被其他进程占用。使用 netstat -tlnp在Notebook中导入包时提示ModuleNotFoundError1. Notebook使用的内核不对未关联到正确的虚拟环境。2. 包确实未安装。1. 在Notebook界面右上角或“Kernel”菜单中检查并切换为正确的内核即你注册的那个。2. 在正确的终端虚拟环境激活状态下使用pip install安装缺失的包。通过Nginx访问页面能打开但无法执行代码或连接中断Nginx配置缺少WebSocket支持或超时设置太短。确保Nginx配置中包含proxy_set_header Upgrade和Connection upgrade部分并适当增加proxy_read_timeout的值。systemd服务启动失败日志显示ModuleNotFoundError: No module named jupytersystemd服务的环境变量PATH中未包含虚拟环境的bin目录。这是最经典的坑务必在jupyter.service文件的[Service]部分通过Environment指令显式设置PATH确保包含你的虚拟环境路径如EnvironmentPATH/home/username/jupyter_env/bin:...。6.2 个人实操心得与避坑指南关于端口SSH隧道两端的端口号可以不同。我习惯将本地端口设为8889远程端口保持8888这样不容易混淆。如果8888被占远程端口也可以改成8889但隧道命令要相应调整-L localhost:8890:localhost:8889。关于日志无论是用nohup还是systemd一定要养成看日志的习惯。journalctl -u jupyter -f或tail -f ~/jupyter.log是解决问题的第一把钥匙。关于虚拟环境永远、永远在虚拟环境中安装和管理Python包。这能彻底解决环境冲突问题。注册内核的步骤虽然多一步但一劳永逸。关于systemd初次配置systemd服务失败的概率很高尤其是环境变量问题。不要灰心仔细检查ExecStart的命令路径和Environment中的PATH。使用systemctl status jupyter和journalctl -xe查看详细错误信息。关于连接稳定性长时间运行的SSH隧道可能因网络波动断开。可以考虑使用autossh工具自动重连或者直接使用tmux/screen在服务器上启动Jupyter这样即使本地SSH断开服务也在服务器上持续运行重连后tmux attach即可。文件传输在远程Jupyter中操作文件如何上传下载除了Jupyter Lab自带的文件上传功能更高效的方式是使用scp命令或SFTP客户端如FileZilla直接与服务器进行文件交换。将服务器的工作目录映射为本地的一个网络驱动器或使用VSCode的远程开发扩展体验会更佳。配置远程Jupyter的过程本质上是在搭建一个属于自己的、可随时访问的云端开发工作站。它把计算密集型任务从性能有限的本地机器剥离出来让你能专注于代码和逻辑本身。虽然初始配置会遇到一些挑战但一旦搭建完成其带来的生产力和便捷性是巨大的。从简单的SSH隧道到复杂的Nginx反向代理与HTTPS你可以根据需求逐步升级你的“工作站”。希望这份详尽的踩坑指南能帮你少走弯路一次成功。如果在配置中遇到上面没覆盖的新问题多查看日志善用搜索理解每一步背后的原理问题总能解决。
返回列表