音乐播放器
Thinker's Space
 
文章 标签
8

Powered by Gridea | Theme: Fog
载入天数...
载入时分秒...

充分利用云服务器(三):Jupyter Lab

Jupyter Lab是基于Jupyter的下一代用户界面,基于Jupyter Nodebook,有更好的用户支持。在服务器上部署Jupyter Lab可以更便捷地从Web访问

部署

项目源地址:Github

个人服务器配置的是Arch Linux,在community库中有安装包,但是个人经验不推荐这么安装:

  • 安装目录在/usr下,因此每次build都需要root权限,比较麻烦;
  • 若以root用户开放运行,那么安全风险较高,因此不太推荐;

因此最终决定在用户目录下以pip/conda安装:

$ pip install jupyterlab

最后再启动即可:

$ jupyter lab

配置

image-20220523151309316
简单配置后的效果演示

基础配置

首先生成配置:

$ jupyter lab --generate-config

这样在~/.jupyter/jupyter_lab_config.py下就会生成用户配置文件,接下来需要修改该文件的几处配置:

# 很关键,不修改的话之后通过nginx反代出去后,远程访问的操作全部无效
c.ServerApp.allow_origin = '*'

# 即使通过nginx反代也需要修改为True
c.ServerApp.allow_remote_acess = True

# 你的Jupyter Lab能访问的目录,不配置就访问整个用户目录
c.ServerApp.notebook_dir = '/path/to/your/dir'

# 登陆密码,一会儿自己生成
c.ServerApp.password = 'you_password'

# 开启密码验证
c.ServerApp.password_required = True

# 访问端口,默认8888
c.ServerApp.Port = 8888

# 如果不通过nginx反代,想通过jupyter本身开启ssl的话,需要填写
c.ServerApp.certfile = '/path/to/your/certfile'
c.ServerApp.keyfile = '/path/to/your/keyfile'

这边再生成一下密码:

$ ipython
In [1]: from notebook.auth import passwd                                                            

In [2]: passwd()                                                                                    
Enter password: 
Verify password: 
Out[2]: 'sha1:f82d919b51bc:bc080b045f2bf8b5e8c41c8c5a3b84ff7c10c25c'

In [3]: exit()

Out[2]里的值复制到配置文件里对应位置即可。

美化配置

服务启动后,访问Jupyter Lab可以查到左侧有插件图标,点进去可以安装插件,至于插件的选择,可以通过Awesome JupyterLab进行参考,个人选择了以下插件:

  • @yeebc/jupyterlab_neon_theme:颜色主题;
  • @jupyterlab/git:git插件,可以进行git操作;
  • @jupyterlab/github:GitHub插件,可以直接打开GitHub项目,需要获取Github Access Token,具体操作见项目说明;
  • @krassowski/jupyterlab-lsp:代码补全引擎;
  • @krassowski/jupyterlab_go_to_definition:变量自动跳转;
  • @ijmbarr/jupyterlab_spellchecker:markdown拼写检查

安装完插件后,会弹出提示需不需要重新build,若build失败(个人大多数情况下是失败的),则需要进入terminal手动build:

$ jupyter lab build

服务与反向代理

创建服务

在每次系统重启或者因为什么原因服务down掉了后,想要重新启动就需要进入终端重启。如何能便捷解决这个问题呢?我选择手动写一份service,交由systemctl管理。

经过简单的学习后,写出了如下service配置文件。

[Unit]
Description=Jupyter Lab
After=network.target

[Service]
Type=simple
User=runtime_username
EnvironmentFile=/path/to/your/jupyter-lab
Restart=on-failure
RestartSec=10

ExecStart=/path/to/your/jupyter-lab --config=/path/to/your/jupyter_lab_config.py
ExecStop=/usr/bin/pkill -9 jupyter
KillMode=process

StandardOutput=file:/tmp/jupyter-output.log
StandardError=file:/tmp/jupyter-error.log

[Install]
WantedBy=multi-user.target

将service文件放入/etc/systemd/system/目录下后,通过运行

$ sudo systemctl daemon-reload

之后就可以像其他服务一样直接管理jupyter。

反向代理

上文提到,jupyter配置文件中本身有ssl开启方式,但在有多个服务运行的情况下,我选择通过nginx统一管理。nginx的安装与配置这边不多介绍,直接上配置文件:

server {
    listen 80;
    listen [::]:80;
    server_name your_server_name;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name your_server_name;
    # ssl 证书写对应位置对应名字
    ssl_certificate /path/to/your/certfile;
    ssl_certificate_key /path/to/your/keyfile;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        # 此处的 8888 是 Jupyter Lab 所开的端口
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        #允许客户端请求的最大单文件字节数
        # client_max_body_size 10m;

        #缓冲区代理缓冲用户端请求的最大字节数,
        #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释 该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
        #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误
        client_body_buffer_size 128k;

        #表示使nginx阻止HTTP应答代码为400或者更高的应答。
        proxy_intercept_errors on;

        #后端服务器连接的超时时间_发起握手等候响应超时时间
        #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_connect_timeout 90;

        #后端服务器数据回传时间(代理发送超时)
        #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
        proxy_send_timeout 90;

        #连接成功后,后端服务器响应时间(代理接收超时)
        #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
        proxy_read_timeout 90;

        #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
        proxy_buffer_size 4k;

        #proxy_buffers缓冲区,网页平均在32k以下的设置
        #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
        proxy_buffers 4 32k;

        #高负荷下缓冲大小(proxy_buffers*2)
        proxy_busy_buffers_size 64k;

        #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
        #设定缓存文件夹大小,大于这个值,将从upstream服务器传
        proxy_temp_file_write_size 64k;
    }
}

这份配置文件也完成了域名直接跳转https的配置,配置完成后,重新reload nginx即可。接下来在浏览器中键入域名即可访问Jupyter Lab了。