Linux服务器部署Jupyter Notebook:conda+anaconda3安全实践指南

发布时间:2026/9/18 1:36:24
Linux服务器部署Jupyter Notebook:conda+anaconda3安全实践指南 1. 为什么在 Linux 服务器上部署 Jupyter Notebook 是刚需而不是“可选项”你有没有遇到过这样的场景团队里数据科学家写完模型代码发来一个.ipynb文件你双击打不开或者你在云服务器上训练好了一个时间序列预测模型想临时加个可视化图表给客户看却只能靠matplotlib.pyplot.savefig()生成一堆 PNG 再手动上传又或者新来的实习生连pip install jupyter都报错反复重装 Python 环境三天没跑通第一个单元格——而你作为运维或技术负责人看着监控面板上空转的 GPU 资源直叹气。这就是典型的“本地开发、远程部署断层”。Jupyter Notebook 的本质不是 IDE而是一个交互式计算服务协议它通过 HTTP 协议暴露内核kernel的执行能力前端只是浏览器渲染层。Linux 服务器正是它最天然的落脚点——稳定、可持久、资源可控、支持多用户隔离。但很多人误以为“pip install jupyter启动就完事”结果要么被防火墙拦住打不开网页要么被 root 权限坑得 kernel 启动失败要么多人同时访问时 session 冲突、文件锁死甚至因未配置 SSL 导致 token 泄露整个 notebook 目录被外部扫描器拖走。我做过 7 个不同行业的 Jupyter 服务落地项目从金融风控建模平台到高校 AI 教学集群踩过的坑几乎覆盖所有热搜词conda activate 报错、jupyter notebook 不跳转网页、代码执行无反应、解压乱码、清华源换源失败……这些都不是孤立问题而是 Linux 环境下权限模型、进程管理、网络栈、字符集、包依赖这五层系统机制共同作用的结果。比如conda init报错表面是 shell 初始化问题根子在.bashrc加载顺序与 conda 安装路径冲突jupyter 不弹浏览器本质是服务器无 GUI 环境下webbrowser.open()默认调用xdg-open失败而非服务没起来解压乱码则是LANG环境变量与 zip 文件编码不匹配导致的字符解码错误——这些细节官方文档不会写但实操中每一步都卡脖子。所以这篇教程不讲“怎么安装”而讲“怎么让 Jupyter 在 Linux 服务器上真正可用、安全、可持续”。它面向三类人一是刚从 Windows 转 Linux 的数据工程师需要避开anaconda3 下载 win7这类思维惯性二是运维人员要理解jupyter notebook本质是个 Python Web Server需按服务标准管理三是团队技术负责人得知道如何设计多用户隔离方案避免实习生删掉生产环境的requirements.txt。核心关键词Linux、Jupyter、notebook、anaconda3、conda不是并列关系而是层级依赖链Linux 提供运行基座conda 提供环境隔离能力anaconda3 提供开箱即用的科学计算栈Jupyter 是最终交付界面。漏掉任何一环都会在后续某次conda update或systemctl restart后突然崩盘。2. 整体架构设计为什么必须绕过 pip坚持用 conda anaconda3很多教程一上来就写pip install jupyter这是对 Linux 服务器场景最大的误判。我实测过在 CentOS 7、Ubuntu 22.04、Debian 12 三种主流发行版上纯 pip 安装 Jupyter 的失败率高达 68%——不是因为命令写错而是因为 pip 无法解决底层二进制依赖的版本锁死问题。比如numpy需要 OpenBLAS 优化库pandas依赖pyarrow的 C ABI 兼容性matplotlib要求freetype和libpng版本匹配……这些在 Windows 上由 Anaconda 打包好的二进制 wheel在 Linux 上得自己编译而服务器通常禁用 gcc或缺少-dev包pip install直接卡在building wheel for numpy。conda 的优势在于它是一个二进制包管理系统不是源码构建工具。它预编译了所有科学计算栈的 Linux x86_64/ARM64 版本并通过repodata.json精确声明每个包的依赖图谱。比如anaconda3-2023.07镜像中jupyter1.0.0 与python3.11、numpy1.24.3、openssl3.0.12的组合经过了 Anaconda 官方全量测试。你执行conda install jupyter实际下载的是已验证兼容的.tar.bz2包解压即用零编译。更关键的是环境隔离能力。Linux 服务器常需同时运行多个项目A 项目用 TensorFlow 2.12要求 CUDA 11.8B 项目用 PyTorch 2.0要求 CUDA 12.1C 项目是教学 demo只用基础scipy。若用系统 Python pip全局 site-packages 会变成依赖地狱。而 conda 创建的虚拟环境是完全独立的文件系统沙盒每个环境有自己的bin/、lib/、include/目录conda activate env_name实质是修改PATH和CONDA_DEFAULT_ENV不污染系统路径。我曾帮一家量化公司迁移旧集群他们原先用virtualenv pip结果一次pip install --upgrade pandas导致风控模型精度下降 0.3%查了三天才发现是numba版本回退引发 JIT 编译失效——这种问题conda 环境天然免疫。所以本方案强制采用anaconda3安装包而非 miniconda原因有三第一anaconda3 自带 250 科学计算包包括jupyterlab、spyder、r-essentials省去后续conda install的网络等待第二其安装脚本Anaconda3-*.sh经过 Linux 发行版适配能自动检测 glibc 版本、处理 SELinux 上下文、设置合理的 umask第三anaconda3的jupyter命令默认启用--allow-root安全策略虽不推荐生产使用但调试阶段极大降低门槛。至于conda本身它是 anaconda3 的包管理器不是独立软件——就像apt之于 Ubuntu你不需要单独“安装 conda”它随 anaconda3 一起部署。提示不要下载官网anaconda3原始包。国内用户务必用清华源镜像https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/。例如Anaconda3-2023.09-Linux-x86_64.sh比官网快 5~10 倍且避免因网络中断导致安装脚本损坏。注意镜像站 URL 结构archive/存放历史版本anaconda/存放最新版教学环境建议用archive/中的 LTS 版本如 2023.07稳定性优于最新版。3. 核心细节解析从安装到安全访问的 7 个关键决策点3.1 安装方式选择为什么用 bash 脚本而非 rpm/deb 包Linux 发行版包管理器apt/yum/dnf确实提供jupyter-notebook包但这是 Debian/Ubuntu 社区维护的版本滞后严重。以 Ubuntu 22.04 为例apt install jupyter-notebook安装的是 6.4.12 版本而 2023 年主流需求是 7.x 的jupyter_server架构支持多目录挂载、token 认证增强、REST API v2。更重要的是apt 包将文件散落在/usr/lib/python3/dist-packages/、/usr/bin/jupyter-notebook、/etc/jupyter/等位置升级时易与 conda 环境冲突。我们实测过apt remove jupyter-notebook后conda 环境中的jupyter lab仍能启动但jupyter notebook命令失效——因为 apt 删除了/usr/bin/jupyter符号链接而 conda 依赖它。bash 脚本安装则完全不同Anaconda3-*.sh是自解压归档所有文件解压到指定目录如/opt/anaconda3完全独立于系统路径。export PATH/opt/anaconda3/bin:$PATH仅影响当前 shell 会话source ~/.bashrc后才全局生效可控性极强。且脚本内置校验机制下载后自动sha256sum校验解压时检查 tarball 完整性安装失败会自动清理临时文件。rpm/deb 包则无此保障曾有用户反馈yum install anaconda3后conda命令不存在查实是 rpm 包元数据缺失postinstall脚本。操作步骤严格按此顺序# 1. 下载清华源镜像注意替换为最新版 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-Linux-x86_64.sh # 2. 校验完整性官方 SHA256 在镜像页提供 sha256sum Anaconda3-2023.09-Linux-x86_64.sh # 输出应匹配镜像页公布的哈希值否则终止安装 # 3. 执行安装--prefix 指定安装路径--silent 静默模式 bash Anaconda3-2023.09-Linux-x86_64.sh -b -p /opt/anaconda3 # 4. 初始化 conda关键否则 conda activate 失效 /opt/anaconda3/bin/conda init bash # 5. 重新加载 shell 配置 source ~/.bashrc注意-b参数表示 batch mode免交互-p指定安装路径。不要用~/anaconda3用户主目录权限复杂易导致多用户环境下jupyter启动失败/opt/是 Linux 标准第三方软件目录root 可写普通用户可读。conda init bash必须执行它会在~/.bashrc末尾追加 conda 初始化代码否则conda activate会报Command conda not found。3.2 用户与权限设计为什么禁止 root 运行必须创建专用服务用户jupyter notebook --allow-root是新手最爱的快捷键但这是生产环境的定时炸弹。root 运行意味着 notebook 进程拥有CAP_SYS_ADMIN能力可任意挂载文件系统、修改内核参数、杀死任意进程。一旦 notebook 中执行!rm -rf /或被恶意 notebook 拖入os.system(reboot)整台服务器瞬间瘫痪。更隐蔽的风险是Jupyter 默认将 notebook 文件保存在工作目录若 root 启动时在/root下生成的.ipynb文件属主为 root普通用户无法编辑若在/home/user下启动root 创建的文件权限为600其他用户连ls都看不到。正确做法是创建专用服务用户jupyter-srv# 创建无登录 shell 的系统用户 sudo useradd -r -s /bin/false jupyter-srv # 创建工作目录并授权 sudo mkdir -p /var/jupyter/notebooks sudo chown jupyter-srv:jupyter-srv /var/jupyter/notebooks sudo chmod 755 /var/jupyter # 切换用户验证 sudo -u jupyter-srv -H /opt/anaconda3/bin/jupyter --version-r参数创建系统用户UID 1000-s /bin/false禁止登录-H设置 HOME 环境变量为/var/jupyter。这样jupyter-srv用户只有/var/jupyter/notebooks的读写权限无法访问/etc、/root等敏感目录。后续所有 Jupyter 配置、日志、notebook 文件均在此目录下审计追踪清晰。3.3 配置生成与 token 安全为什么必须禁用密码改用 token HTTPSJupyter 默认启动时生成随机 token形如?tokenabc123...这是最安全的认证方式。但很多人误用--password生成哈希密码这反而降低安全性——因为密码哈希存储在~/.jupyter/jupyter_notebook_config.py中若配置文件权限设为644同服务器其他用户可读取哈希值再用john工具暴力破解。而 token 是内存中生成每次启动刷新且可通过--no-browser参数强制不打开本地浏览器杜绝 token 泄露风险。HTTPS 是另一道生死线。HTTP 明文传输 token中间人可截获并接管 notebook 会话。我们曾用 Wireshark 抓包验证未加密时GET /api/sessions?tokenxxx请求中 token 清晰可见。因此必须配置 SSL 证书。自签名证书足够教学使用# 生成自签名证书有效期 365 天 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /var/jupyter/jupyter.key \ -out /var/jupyter/jupyter.crt \ -subj /CCN/STBeijing/LBeijing/OJupyter/CNlocalhost # 设置证书权限 sudo chown jupyter-srv:jupyter-srv /var/jupyter/jupyter.* sudo chmod 600 /var/jupyter/jupyter.key-subj参数跳过交互式提问CNlocalhost匹配服务器域名。证书路径必须绝对路径相对路径在 systemd 服务中会解析失败。3.4 端口与防火墙为什么选 8888 之外的端口且必须绑定 127.0.0.1jupyter notebook --port8888是默认但 8888 端口已被大量扫描器盯上。Shodan 数据显示全球暴露在公网的 8888 端口 Jupyter 实例中32% 未设 token可直接执行任意代码。更危险的是若服务器有公网 IP 且未配置防火墙--ip0.0.0.0会让 Jupyter 监听所有网卡包括 eth0公网、docker0容器网络、lo本地环回——这等于把 notebook 门钥匙扔在大街上。正确姿势是绑定 127.0.0.1 反向代理。Jupyter 仅监听本地环回地址再用 Nginx 做反向代理统一处理 HTTPS、认证、限速。这样既避免端口暴露又可复用 Nginx 的 WAF 规则。端口选 8889避开常用端口扫描范围配置如下# 生成配置文件 sudo -u jupyter-srv -H /opt/anaconda3/bin/jupyter notebook --generate-config # 编辑 /var/jupyter/.jupyter/jupyter_notebook_config.py c.NotebookApp.ip 127.0.0.1 # 仅监听本地 c.NotebookApp.port 8889 # 非默认端口 c.NotebookApp.open_browser False # 禁止自动打开 c.NotebookApp.certfile /var/jupyter/jupyter.crt c.NotebookApp.keyfile /var/jupyter/jupyter.key c.NotebookApp.token # 禁用 token由 Nginx 控制 c.NotebookApp.password # 禁用密码 c.NotebookApp.allow_origin * # 允许跨域Nginx 代理时必需 c.NotebookApp.disable_check_xsrf True # 关闭 XSRF 检查Nginx 代理必需disable_check_xsrf True是关键——Nginx 代理时原始请求头被剥离Jupyter 的 XSRF token 验证会失败必须关闭。3.5 systemd 服务化为什么不用 screen/nohup必须用 systemctlnohup jupyter notebook 是最简陋的后台启动但它有致命缺陷进程无父进程管理OOM Killer 可随意 kill日志无法轮转nohup.out会无限增长服务崩溃后不会自动重启ps aux | grep jupyter查到的 PID 不可靠kill -9可能杀错进程。systemd 则提供完整的生命周期管理# /etc/systemd/system/jupyter.service [Unit] DescriptionJupyter Notebook Service Afternetwork.target [Service] Typesimple Userjupyter-srv Groupjupyter-srv WorkingDirectory/var/jupyter/notebooks EnvironmentPATH/opt/anaconda3/bin:/usr/local/bin:/usr/bin:/bin ExecStart/opt/anaconda3/bin/jupyter notebook --config/var/jupyter/.jupyter/jupyter_notebook_config.py Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal SyslogIdentifierjupyter [Install] WantedBymulti-user.targetTypesimple表示主进程即服务进程Restartalways确保崩溃后 10 秒重启StandardOutputjournal将日志接入 journalctl可journalctl -u jupyter -f实时查看。执行sudo systemctl daemon-reload sudo systemctl enable jupyter sudo systemctl start jupyter后服务即受 systemd 全面管控。3.6 Nginx 反向代理为什么必须添加 X-Real-IP 和 WebSocket 支持Nginx 配置是安全闭环的最后一环。仅做proxy_pass http://127.0.0.1:8889不够Jupyter 依赖 WebSocket 实时通信如 cell 输出流、kernel heartbeat需显式开启# /etc/nginx/conf.d/jupyter.conf server { listen 443 ssl; server_name jupyter.example.com; # 替换为你的域名 ssl_certificate /var/jupyter/jupyter.crt; ssl_certificate_key /var/jupyter/jupyter.key; location / { proxy_pass https://127.0.0.1:8889; 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 支持 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } # 静态文件缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, immutable; } }X-Real-IP保证 Jupyter 日志记录真实客户端 IPUpgrade和Connection头是 WebSocket 握手必需。若缺少这两行notebook 页面会卡在 “Connecting to kernel…” 状态控制台报WebSocket connection to wss://... failed。3.7 多用户隔离为什么 conda 环境比 Docker 更轻量高效Docker 常被推荐用于多用户 Jupyter但对中小团队是过度设计。启动一个 Jupyter 容器需 500MB 内存而 conda 环境仅需 200MBDocker 需维护镜像仓库、网络配置、卷挂载而 conda 环境只需conda create -n user1 python3.11一条命令。我们对比过10 个用户各一个环境conda 总内存占用 2.1GBDocker 为 5.3GB环境创建时间conda 平均 42 秒Docker 为 3 分钟含镜像拉取。实际方案是为每个用户创建独立 conda 环境再通过 JupyterHub 统一调度。JupyterHub 是专为多用户设计的代理服务它不运行 notebook只负责认证和启动用户专属的 notebook 服务。安装 JupyterHubsudo -u jupyter-srv -H /opt/anaconda3/bin/conda install -c conda-forge jupyterhub sudo -u jupyter-srv -H /opt/anaconda3/bin/jupyterhub --generate-config配置/var/jupyter/.jupyter/jupyterhub_config.pyc.JupyterHub.spawner_class sudospawner.SudoSpawner c.Spawner.cmd [/opt/anaconda3/bin/jupyterhub-singleuser] c.Spawner.default_url /lab # 默认跳转 JupyterLab c.Authenticator.admin_users {admin} # 管理员用户名 c.PAMAuthenticator.open_sessions False用户登录后JupyterHub 以对应系统用户身份启动 notebook环境隔离彻底资源消耗最低。4. 实操过程从零开始的完整部署流程含命令、参数、验证4.1 环境准备与基础检查部署前必须确认服务器状态避免后续步骤失败。这不是形式主义而是经验教训的结晶。我们曾遇到三次因基础环境异常导致的部署失败第一次是glibc版本过低CentOS 6.5 的 glibc 2.12 不支持 anaconda3 的二进制第二次是ulimit -n限制为 1024Jupyter 启动后无法建立足够 WebSocket 连接第三次是 SELinux 启用状态jupyter进程被拒绝写入/var/jupyter/notebooks。执行以下检查清单# 1. 确认系统版本与架构 cat /etc/os-release uname -m # 应为 x86_64 或 aarch64 # 2. 检查 glibc 版本anaconda3 要求 2.17 ldd --version # 3. 检查可用内存至少 2GB free -h # 4. 检查磁盘空间/opt 至少 5GB df -h /opt # 5. 检查 ulimit建议 65536 ulimit -n # 6. 检查 SELinux 状态若启用临时设为 permissive sudo sestatus # 若为 enforcing执行sudo setenforce 0重启后恢复若ldd --version输出2.12或更低必须升级系统或换用 miniconda其二进制兼容性更强ulimit -n若小于 4096需在/etc/security/limits.conf中添加* soft nofile 65536 * hard nofile 65536然后重启会话。4.2 anaconda3 安装与 conda 初始化严格按顺序执行跳步会导致conda activate失效。清华源下载地址需手动访问镜像站获取最新版本文以2023.09为例# 下载确保 wget 已安装 sudo yum install -y wget # CentOS/RHEL # 或 sudo apt install -y wget # Ubuntu/Debian wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-Linux-x86_64.sh # 校验镜像页提供 SHA256此处为示例值 echo a1b2c3d4e5f6... Anaconda3-2023.09-Linux-x86_64.sh | sha256sum -c # 安装到 /opt/anaconda3 bash Anaconda3-2023.09-Linux-x86_64.sh -b -p /opt/anaconda3 # 初始化 conda此步不可省略 /opt/anaconda3/bin/conda init bash # 重新加载配置此时 conda 命令才可用 source ~/.bashrc # 验证安装 conda --version # 应输出 23.7.4 或类似 /opt/anaconda3/bin/python --version # 应输出 Python 3.11.5实操心得若conda init bash后conda命令仍不可用检查~/.bashrc是否被其他脚本覆盖。常见原因是.bash_profile中source ~/.bashrc被注释或某些发行版默认不加载.bashrc。解决方案在~/.bash_profile末尾添加source ~/.bashrc然后source ~/.bash_profile。4.3 创建服务用户与目录结构创建jupyter-srv用户是安全基石必须由 root 执行# 创建用户 sudo useradd -r -s /bin/false jupyter-srv # 创建目录结构 sudo mkdir -p /var/jupyter/{notebooks,logs,config} # 授权注意-R 递归授权但 /var/jupyter 本身权限为 755 sudo chown -R jupyter-srv:jupyter-srv /var/jupyter sudo chmod 755 /var/jupyter # 验证用户权限 sudo -u jupyter-srv -H touch /var/jupyter/test.txt echo 权限正常 || echo 权限错误 sudo -u jupyter-srv -H rm /var/jupyter/test.txt/var/jupyter/notebooks是 notebook 文件存放目录/var/jupyter/logs存放服务日志/var/jupyter/config存放配置文件。chmod 755 /var/jupyter确保jupyter-srv用户可进入目录其他用户可读便于运维查看。4.4 生成 SSL 证书与 Jupyter 配置自签名证书生成需 root 权限但证书文件属主必须为jupyter-srv# 生成证书CN 必须与访问域名一致此处用 localhost sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /var/jupyter/jupyter.key \ -out /var/jupyter/jupyter.crt \ -subj /CCN/STBeijing/LBeijing/OJupyter/CNlocalhost # 修改属主 sudo chown jupyter-srv:jupyter-srv /var/jupyter/jupyter.* # 生成 Jupyter 配置 sudo -u jupyter-srv -H /opt/anaconda3/bin/jupyter notebook --generate-config # 编辑配置文件使用 sed 批量替换避免手动编辑出错 sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.ip .*/c.NotebookApp.ip 127.0.0.1/g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.port .*/c.NotebookApp.port 8889/g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.open_browser .*/c.NotebookApp.open_browser False/g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s|#c.NotebookApp.certfile .*|c.NotebookApp.certfile /var/jupyter/jupyter.crt|g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s|#c.NotebookApp.keyfile .*|c.NotebookApp.keyfile /var/jupyter/jupyter.key|g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.token .*/c.NotebookApp.token /g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.password .*/c.NotebookApp.password /g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.allow_origin .*/c.NotebookApp.allow_origin */g /var/jupyter/.jupyter/jupyter_notebook_config.py sudo -u jupyter-srv -H sed -i s/#c.NotebookApp.disable_check_xsrf .*/c.NotebookApp.disable_check_xsrf True/g /var/jupyter/.jupyter/jupyter_notebook_config.py注意sed命令中的#c.是注释行前缀替换时去掉#即可启用。若配置文件中无对应行sed会静默失败需手动检查/var/jupyter/.jupyter/jupyter_notebook_config.py确认参数已写入。4.5 systemd 服务配置与启动创建 service 文件并启用# 创建 service 文件 sudo tee /etc/systemd/system/jupyter.service /dev/null EOF [Unit] DescriptionJupyter Notebook Service Afternetwork.target [Service] Typesimple Userjupyter-srv Groupjupyter-srv WorkingDirectory/var/jupyter/notebooks EnvironmentPATH/opt/anaconda3/bin:/usr/local/bin:/usr/bin:/bin ExecStart/opt/anaconda3/bin/jupyter notebook --config/var/jupyter/.jupyter/jupyter_notebook_config.py Restartalways RestartSec10 StandardOutputjournal StandardErrorjournal SyslogIdentifierjupyter [Install] WantedBymulti-user.target EOF # 重载 systemd 配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable jupyter # 启动服务 sudo systemctl start jupyter # 检查状态 sudo systemctl status jupyter # 应显示 active (running)且无 error 日志若systemctl status jupyter显示failed用sudo journalctl -u jupyter -n 50查看最后 50 行日志。常见错误Permission denied是证书路径错误或权限不足Address already in use是端口被占用No module named jupyter是 PATH 未正确设置。4.6 Nginx 安装与反向代理配置Nginx 是反向代理首选因其轻量、稳定、配置简单# Ubuntu/Debian sudo apt update sudo apt install -y nginx # CentOS/RHEL sudo yum install -y epel-release sudo yum install -y nginx # 启用并启动 sudo systemctl enable nginx sudo systemctl start nginx # 创建 Jupyter 配置 sudo tee /etc/nginx/conf.d/jupyter.conf /dev/null EOF server { listen 443 ssl; server_name localhost; ssl_certificate /var/jupyter/jupyter.crt; ssl_certificate_key /var/jupyter/jupyter.key; location / { proxy_pass https://127.0.0.1:8889; 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; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, immutable; } } EOF # 测试配置并重载 sudo nginx -t sudo systemctl reload nginx验证在服务器本地执行curl -k https://localhost应返回 Jupyter 的 HTML 页面源码含Jupyter Notebook字样。若返回502 Bad Gateway检查netstat -tuln | grep 8889确认 Jupyter 是否监听成功若返回SSL certificate problem检查证书路径是否正确。4.7 多用户环境创建与 JupyterHub 部署为用户alice创建专属环境# 切换到 jupyter-srv 用户 sudo -u jupyter-srv -H bash # 创建 conda 环境 /opt/anaconda3/bin/conda create -n alice python3.11 jupyter numpy pandas matplotlib # 激活环境并安装额外包 /opt/anaconda3/bin/conda activate alice /opt/anaconda3/envs/alice/bin/pip install scikit-learn tensorflow # 退出 exit # 验证环境 sudo -u jupyter-srv -H /opt/anaconda3/bin/conda info --envs # 应看到 base 和 alice 两个环境JupyterHub 部署# 安装 JupyterHub sudo -u jupyter-srv -H /opt/anaconda3/bin/conda install -c conda-forge jupyterhub # 生成配置 sudo -u jupyter-srv -H /opt/anaconda3/bin/jupyterhub --generate-config # 编辑配置关键指定 spawner 和环境 sudo -u j