当前位置: 首页 > news >正文

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。

我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行 Jupyter Notebook 可以让你安全地管理机器学习项目,共享笔记本,并利用服务器的计算能力。
alt text

Jupyter Notebook 简介

Jupyter Notebook 是一款开源的 Web 应用程序,允许用户创建和共享包含实时代码、方程式、可视化和叙述文本的文档。这些文档被称为“笔记本”,它们提供了一个交互式环境,非常适合进行数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。

主要特点:

  • 交互式计算: 在 Notebook 中,您可以逐个单元格地运行代码,并立即查看结果。这使得调试和探索数据变得更加容易。
  • 支持多种语言: 虽然最常用于 Python,但 Jupyter Notebook 也支持其他编程语言,例如 R、Julia、Scala 等。
  • 数据可视化: 您可以直接在 Notebook 中创建各种图表和图形,以便更好地理解数据。
  • 富文本格式: 除了代码之外,您还可以使用 Markdown 语法添加标题、段落、列表、链接、图像等,使您的文档更具可读性和条理性。
  • 易于分享: 您可以将 Notebook 保存为多种格式,例如 .ipynb、.html、.pdf 等,方便与他人共享您的工作。
  • 扩展性强: Jupyter Notebook 拥有丰富的扩展生态系统,可以增强其功能,例如代码自动补全、版本控制、主题定制等。

典型应用场景:

  • 数据分析和可视化: 探索、清理、转换和可视化数据。
  • 机器学习: 构建、训练和评估机器学习模型。
  • 科学计算: 进行数值模拟和科学实验。
  • 教学和培训: 创建交互式学习材料。
  • 文档记录: 记录研究过程和结果。

Jupyter Notebook 的基本组成部分:

  • 单元格 (Cell): Notebook 的基本单位,可以包含代码或 Markdown 文本。
  • 内核 (Kernel): 负责执行代码的计算引擎。
  • 笔记本文件 (.ipynb): 包含 Notebook 所有内容的 JSON 格式文件。

环境准备

服务器准备

必要前提:

  • 一个充满求知欲的大脑。
  • 一个指向服务器 IP 的域名(可选)。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。本文将以雨云为例进行演示。

我将以 雨云 为例,带大家创建一台自己的云服务器,以便尝试本篇文章的内容。

注册链接: https://rainyun.ivwv.site/

创建雨云服务器

以下步骤仅供参考,请根据实际需求选择配置。

点击 云产品云服务器立即购买

创建服务器

选择距离你较近的区域,以保证低延迟。

选择区域

选择配置。

选择配置

选择 Ubuntu 22.04 版本。

选择操作系统

最后点击 立即购买,并按照提示进行购买。购买后等待机器部署完毕,点击购买的服务器,进入管理面板,找到远程连接相关信息。

服务器管理面板

远程连接信息

使用 PowerShell 进行远程连接。

PowerShell 远程连接

输入 ssh root@你的服务器IP 例如 ssh root@154.9.227.239 回车后,首次需要输入 yes,再次回车后即可登录服务器。

登录服务器

到此为止,我们的云服务器就创建好了。

开始安装

第 1 步:更新服务器

首先,更新服务器以确保所有软件包都是最新的。

sudo apt update && sudo apt upgrade -y

这条命令将更新软件包列表并升级现有软件到最新版本。

第 2 步:安装 Python 和所需库

如果服务器上尚未安装 Python 3,请安装 Python 3 以及 pip(Python 包安装程序)和一些基本的开发工具:

sudo apt install python3 python3-pip python3-dev build-essential -y

安装完成后,你可以通过运行以下命令来验证 Python 和 pip 的安装:

python3 --version
pip3 --version

第 3 步:设置虚拟环境

为了保持环境的整洁并避免与其他项目发生冲突,建议设置一个 Python 虚拟环境。

安装 venv 模块:

sudo apt install python3-venv -y

在所需目录中创建一个虚拟环境:

python3 -m venv jupyter_env

激活虚拟环境:

source jupyter_env/bin/activate

当虚拟环境激活后,你的 shell 提示符会显示环境名称,表明你已处于隔离环境中。

第 4 步:安装 Jupyter Notebook

虚拟环境设置好后,你可以使用 pip 安装 Jupyter Notebook:

pip install jupyter

这将安装 Jupyter 及其依赖项。安装完成后,可以通过以下命令进行验证:

jupyter --version

第 5 步:配置 Jupyter Notebook 以实现远程访问

默认情况下,Jupyter 仅允许从本地访问。要远程访问,你需要配置它以监听外部连接。

生成 Jupyter 配置文件:

jupyter notebook --generate-config

这将在 ~/.jupyter/jupyter_notebook_config.py 处创建一个配置文件。

为 Jupyter Notebook 设置密码以防止未授权访问:

jupyter notebook password

系统会提示你输入并验证密码。加密后的密码将存储在 jupyter_notebook_config.json 文件中以确保安全。

编辑配置文件以允许远程访问:

打开配置文件:

nano ~/.jupyter/jupyter_notebook_config.py

找到并修改以下行(如果它们被注释了,请取消注释):

# c.ServerApp.ip = 'localhost'
# c.ServerApp.port = 0

修改为:

c.ServerApp.ip = '0.0.0.0'
c.ServerApp.port = 8888

此配置允许 Jupyter 监听所有可用 IP 地址(0.0.0.0)并禁用服务器上的自动浏览器打开。

第 6 步:配置防火墙

如果你启用了 UFW 防火墙,你需要添加 TCP 端口:

sudo ufw allow 8888/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

第 7 步:运行 Jupyter Notebook

在虚拟环境中运行 Jupyter Notebook 服务器,执行以下命令:

jupyter notebook

在浏览器中访问 Jupyter 笔记本:

http://server_ip:8888

第 8 步:从本地机器访问 Jupyter Notebook

要远程访问 Jupyter Notebook,你需要使用 SSH 隧道连接,或直接在防火墙上打开端口(由于安全风险,不推荐)。

通过 SSH 隧道访问 Jupyter(推荐)

在本地机器上运行以下命令:

ssh -L 8888:localhost:8888 username@your_server_ip

此命令将本地机器的 8888 端口转发到远程服务器的 8888 端口。运行命令后,你可以通过在浏览器中访问:

http://localhost:8888

第 9 步:将 Jupyter 设置为系统服务

为确保 Jupyter Notebook 服务器在重启后自动启动,你可以将其配置为 systemd 服务。

创建一个新的服务文件:

sudo nano /etc/systemd/system/jupyter.service

在文件中添加以下配置,将 /home/username/ 替换为你的实际主目录路径,将 username 替换为你的用户账户:

[Unit]
Description=Jupyter Notebook
[Service]
Type=simple
PIDFile=/run/jupyter.pid
ExecStart=/home/username/jupyter_env/bin/jupyter-notebook --config=/home/username/.jupyter/jupyter_notebook_config.py
User=username
Group=username
WorkingDirectory=/home/username
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

重新加载 systemd 并启用服务:

sudo systemctl daemon-reload
sudo systemctl enable jupyter
sudo systemctl start jupyter

现在 Jupyter 将在重启后自动启动并在后台运行。

检查 jupyter 服务状态:

systemctl status jupyter

在这里你将找到令牌:

Oct 15 02:24:23 jupyter jupyter-notebook[5385]:         http://jupyter:8888/tree?token=16dc4db2331c725588a7930cf5f09d005f53a4d421061e9d
Oct 15 02:24:23 jupyter jupyter-notebook[5385]:         http://127.0.0.1:8888/tree?token=16dc4db2331c725588a7930cf5f09d005f53a4d421061e9d

你需要这个令牌来登录,或者更改登录密码。

第 10 步:为 Jupyter Notebook 安装 Nginx

为了使你的 Jupyter Notebook 服务器更安全,并且可以通过 HTTPS 访问,你可以使用 Nginx 作为反向代理,并使用 Certbot 从 Let’s Encrypt 获取免费的 SSL 证书。这种设置确保了你与 Jupyter Notebook 服务器的连接是加密的,这在处理敏感数据时非常重要。

以下是安装 Nginx、将其配置为 Jupyter 的反向代理,并使用 Certbot 从 Let’s Encrypt 获取 SSL 证书的步骤。

安装 Nginx

首先,在服务器上安装 Nginx:

sudo apt install nginx -y

安装 Nginx 后,启动并启用它:

sudo systemctl start nginx
sudo systemctl enable nginx

通过在浏览器中打开服务器的 IP 地址来检查 Nginx 是否运行。你应该能看到 Nginx 的默认页面。

将 Nginx 配置为 Jupyter 的反向代理

要允许 Nginx 作为 Jupyter Notebook 的反向代理,创建一个新的 Nginx 配置文件。

创建一个新的配置文件:

sudo nano /etc/nginx/sites-available/jupyter

在文件中添加以下内容,将 your_domain_or_IP 替换为你的实际域名或服务器 IP:

server {listen 80;server_name your_domain_or_IP;location / {proxy_pass http://localhost:8888;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";}
}

此配置将所有端口 80(HTTP)上的流量定向到端口 8888 上运行的 Jupyter Notebook。

通过创建符号链接启用配置:

sudo ln -s /etc/nginx/sites-available/jupyter /etc/nginx/sites-enabled/

测试 Nginx 配置是否有错误:

sudo nginx -t

重启 Nginx 以应用更改:

sudo systemctl restart nginx

此时,Nginx 会将 http://your_domain_or_IP 的流量转发到端口 8888 上的 Jupyter Notebook。但是,连接仍然不安全。在接下来的步骤中,我们将使用 Certbot 设置 SSL。

安装 Certbot 并获取 SSL 证书

Let’s Encrypt 提供免费的 SSL 证书,Certbot 自动化了获取和续订证书的过程。

安装 Certbot 和 Nginx 插件:

sudo apt install certbot python3-certbot-nginx -y

使用 Certbot 为你的域名获取 SSL 证书:

sudo certbot --nginx -d your_domain_or_IP

Certbot 会提示你提供用于紧急续订通知的电子邮件地址,并同意服务条款。之后,Certbot 将自动获取并配置 Nginx 的 SSL 证书。

验证 SSL 安装:

你现在可以通过 https://your_domain_or_IP 安全地访问你的 Jupyter Notebook。浏览器将显示锁图标,表示连接是安全的。

第 11 步:为机器学习项目优化 Jupyter

对于机器学习项目,你可以通过以下优化来增强你的 Jupyter Notebook 设置:

a) 安装必要的库

对于机器学习,你需要安装像 NumPy, Pandas, scikit-learn, Matplotlib, Seaborn, TensorFlow, 和 PyTorch 这样的库:

pip install numpy pandas scikit-learn matplotlib seaborn tensorflow torch
b) 利用 GPU 进行机器学习

如果你的服务器有 GPU,你可以安装 TensorFlow 和 PyTorch 的 GPU 版本来加速模型训练:

TensorFlow:

pip install tensorflow-gpu

PyTorch:

你可以在 PyTorch 的官方网站上找到适合你设置的安装命令。

c) 笔记本扩展

安装 Jupyter Notebook 扩展以增强功能,如目录、代码折叠等:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable codefolding/main

结论

我们已经看到了如何在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。你已经成功安装并配置了用于远程机器学习项目的 Jupyter Notebook 服务器。这种设置允许你在功能强大的远程服务器上运行机器学习实验、管理代码和可视化结果。确保在将 Jupyter 暴露到互联网上时保护你的设置,并根据项目需求优化服务器。

通过远程运行 Jupyter,你可以从任何地方访问你的 Notebook,同时利用服务器的资源,这是复杂机器学习项目的理想解决方案。

相关链接
雨云 - 新一代云服务提供商: https://www.rainyun.com/NTEzMTM1_?s=blog
面试鸭:https://mianshiya.com/?shareCode=sq29yv
我的博客:https://blog.ivwv.site

相关文章:

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook,并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…...

免费申请 Let‘s Encrypt SSL 证书

免费申请 Lets Encrypt SSL 证书 在网络安全日益重要的今天,为网站启用 SSL 证书是保障数据安全和用户信任的关键。Lets Encrypt 提供的免费 SSL 证书是一个很好的选择。下面我们详细介绍如何为网站域名申请该证书。 一、准备工作 域名 确保已注册要使用 SSL 证书的…...

【JAVA】Java基础—面向对象编程:继承—重写父类方法

在Java开发中,重写(Override)是面向对象编程(OOP)中的一个重要概念。它允许子类提供父类方法的具体实现,从而改变或扩展父类的行为。重写是实现多态性的重要手段,使得程序在运行时能够根据对象的…...

【C++初阶】C++入门

1、C第一个程序 C是脱胎于C语言的&#xff0c;所以也包含了C语言绝大多数的内容&#xff0c;C兼容C语言绝大多数的语法,在C语言中能实现的程序在C中也是可以执行的&#xff0c;但需要将定义文件代码的后缀改为.cpp 就比如hello world程序 // test.cpp #include<stdio.h&g…...

自然推理系统:的拒取式的解析

要推导出 **"非A"** 的拒取式 (rejection form)&#xff0c;首先我们要理解逻辑推理中几个基本的概念。 假设我们有以下前提&#xff1a; 1. **A → B** &#xff08;如果A成立&#xff0c;那么B成立&#xff09; 2. **非B** &#xff08;B不成立&#xff09; 我们…...

OceanBase 分区表详解

1、分区表的定义 在OceanBase数据库中&#xff0c;普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中&#xff0c;同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表&#xff0c;而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…...

Java中 LinkedList<>,ArrayDeque<>的区别 || Queue和Deque的区别

我是你爹 LinkedList<> 和 ArrayDeque<> 的区别Queue接口 和 Deque接口区别Queue 的用法Deque 的用法 LinkedList<> 和 ArrayDeque<> 的区别 1. 数据结构实现方式&#xff1a; LinkedList&#xff1a; 基于链表结构&#xff0c;是一个双向链表。每个…...

freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题

采用 try (Writer writer new OutputStreamWriter(os, “UTF-8”)) UTF-8 内容转换 public static void setResponseHeader(HttpServletResponse response, String fileName) {try {// fileName "中文.xls";try {fileName new String(fileName.getBytes(),"…...

arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现

水果选择与管理&#xff1a;基于 ArkUI 的长按编辑功能实现 1 主要内容说明2 相关内容2.1 相关内容2.1.1 源码1内容的相关说明2.1.1.1 数据结构与状态管理2.1.1.2 添加水果功能2.1.1.3 水果列表展示2.1.1.4 长按进入编辑模式2.1.1.5 复选框的多选功能2.1.1.6 删除水果功能2.1.1…...

docker使用,docker图形化界面+docker详细命令

DockerUI进入 docker container run --rm --name docker.ui -v /var/run/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui访问8999端口就行&#xff0c;就可以图形化管理Docker了 常规使用 搭建 sudo docker-compose build #有一些需要这条命令 su…...

idea项目运行时 java: 错误: 不支持发行版本 21

java项目运行时&#xff0c;同样的项目别的都是正常运行&#xff0c;单个这个项目一直报 java: 错误: 不支持发行版本 21&#xff0c; 报错的解释 这个错误表明你正在尝试使用Java编译器编译一个类&#xff0c;但是编译器遇到了一个它不支持的版本号&#xff0c;在这个上下文…...

hive alter table add columns 是否使用 cascade 的方案

结论 alter table xxx add columns 时加上 cascade 时&#xff0c;会把所有的分区都加上此字段。如果不加则只有新的分区会加上此字段&#xff0c;旧的分区没有此字段&#xff0c;即便数据文件里有对应的数据&#xff0c;也不能显示内容。 如果分区都是 insert overwrite 生成…...

手机怎么玩steam游戏?随时随地远程串流玩steam游戏教程

喜欢在steam上玩游戏的玩家有没有想过&#xff0c;其实这些游戏也能在手机上玩呢&#xff1f;不管是探索的开放世界游戏&#xff0c;还是紧张刺激的射击游戏&#xff0c;还是丰富剧情的视觉小说等等&#xff0c;这些游戏你都可以通过远程串流软件&#xff0c;来帮你实现在手机上…...

【使用antv g6实现拓扑图】

使用antv g6实现拓扑图 安装antv g6创建一个 div&#xff0c;并制定必须的属性 id定义初始化方法定义node节点数据将获取到的数据渲染进页面 安装antv g6 npm install antv/g6 --save import G6 from antv/g6;创建一个 div&#xff0c;并制定必须的属性 id 定义好展示id&…...

【数学 函数空间】拉普拉斯变换解微分方程步骤

拉普拉斯变换解微分方程 拉普拉斯变换解微分方程的一般步骤如下&#xff1a; 写出微分方程。对微分方程两边应用拉普拉斯正变换。求解变换后的代数方程&#xff0c;得到 Y ( s ) Y(s) Y(s)。如果需要&#xff0c;进行部分分式分解。对 Y ( s ) Y(s) Y(s)进行拉普拉斯逆变换&…...

vue3: toRef, reactive, toRefs, toRaw

vue3&#xff1a; toRef, reactive, toRefs, toRaw <template><div>{{ man }}</div><hr><!-- <div>{{ name }}--{{ age }}--{{ like }}</div> --><div><button click"change">修改</button></div&g…...

Unity读取Json

参考 Unity读取Json的几种方法_unity读取json文件-CSDN博客...

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…...

c++的几种构造函数

c的几种构造函数 构造函数拷贝构造函数转换构造函数移动构造函数 析构函数 构造函数 C中的构造函数可以分为5类&#xff1a;默认构造函数、普通构造函数、拷贝构造函数、转换构造函数、移动构造函数。 好像还有委托构造 默认构造和普通构造和java基本一样 详细 拷贝构造函…...

FRP 实现内网穿透

如何通过 FRP 实现内网穿透&#xff1a;群晖 NAS 的 Gitea 和 GitLab 访问配置指南 在自建服务的过程中&#xff0c;经常会遇到内网访问受限的问题。本文将介绍如何利用 FRP&#xff08;Fast Reverse Proxy&#xff09;来实现内网穿透&#xff0c;以便在外网访问群晖 NAS 上的…...

数据结构笔记(其八)--一般树的存储及其遍历

1.知识总览 一般的树会有多个孩子&#xff0c;所以存储结构也会与二叉树略有不同。 一般树的遍历。 2.双亲表示法 双亲表示法&#xff0c;也是父亲表示法&#xff0c;即每个节点中都存储了其父节点的地址信息。 特性&#xff1a;可以轻易地找到父节点&#xff0c;但寻找孩子节…...

在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案

1. 问题描述 首先编写一个Filter类并通过Component放入spring容器中&#xff0c;通过实现jakarta.servlet中提供的Filter接口完成过滤器的创建&#xff0c;代码如下。 import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import org.springframework.st…...

浅谈“通感一体”

文章目录 5G_Advanced的关键技术通感一体的介绍通感一体应用通感一体面临的挑战 5G_Advanced的关键技术 2024年6月18日16点30分&#xff0c;在上海举行的3GPP RAN第104次会议上&#xff0c;R18标准正式冻结&#xff0c;标志着5G技术的又一重要里程碑。值得注意的是&#xff0c…...

【Linux】监控系统Zabbix的安装与配置

文章目录 一、前期准备1、安装LAMP2、配置SELinux与防火墙3、测试Apache4、配置数据库5、创建zabbix数据库及应用 二、server端安装配置1、软件包安装2、配置数据库3、zabbix访问测试4、配置web界面 三、Agent端安装配置1、安装zabbix-agent2、配置3、启动zabbix-agent4、配置防…...

Springboot定时任务

Component EnableScheduling public class SpringBootTestJob {Scheduled(cron "0/5 * * * * ?")public void testScheduled(){System.out.println("SpringBootTestJob test");} }这段代码使用了 Spring Boot 自带的定时任务机制。解释如下&#xff1a; …...

node.js知识点总结

1、Node.js Node. js是一个基于 Chrome v8引擎的服务器端 JavaScript运行环境&#xff1b;Node. js是一个事件驱动、非阻塞式I/O的模型&#xff0c;轻量而又高效&#xff1b;Node. js的包管理器npm是全球最大的开源库生态系统。 2、数据处理中的buffer&#xff1a; 具体…...

Kotlin中泛型的协变

interface Shapeclass Circle : Shapefun main() {val shapes1: List<Shape> listOf<Circle>()val shapes2: MutableList<Shape> mutableListOf<Circle>() }如上代码&#xff0c;第一行赋值语句是OK的&#xff0c;第二行赋值语句在编辑器上直接就报错…...

第三百二十五节 Java线程教程 - Java Fork/Join框架

Java线程教程 - Java Fork/Join框架 fork/join框架通过利用机器上的多个处理器或多个内核来解决问题。 该框架有助于解决涉及并行性的问题。 fork/join框架创建一个线程池来执行子任务。 当线程在子任务上等待完成时&#xff0c;框架使用该线程来执行其他线程的其他未决子任…...

网络游戏安全现状及相关应对方案

中国网络游戏历经十余年的飞速发展&#xff0c;取得了显著成就&#xff0c;但与此同时&#xff0c;也陷入了诸多安全问题的泥沼。 一、中国网络游戏发展中的安全困境 &#xff08;一&#xff09;灰色产业链滋生 外挂、私服、盗号、打金工作室以及网络信息诈骗等灰色产业链在…...

uniapp h5地址前端重定向跳转

简单说下功能&#xff0c;就是在地址输入http://localhost:8080/home 会自行跳转到http://localhost:8080/pages/home/index&#xff0c;如果有带参数的话也会携带上去。 ps&#xff1a;只能在h5中使用 首先需要用到query-string 安装query-string npm install query-string…...