服务器安装Jupyter Lab(Python与R环境)
前言¶
这学期学的《概率论与数理统计》课有作业需要用到R,加上双十一从腾讯云搞了一台2H4G8M的机器,性能大大提升,因此打算打造一个云服务来运行Python,同时兼顾R。
在安装的过程中碰到了超级多的问题,所以下面介绍一下安装的流程,记录一些很久才解决的问题。
系统信息
OS: Ubuntu 20.04
Python: 3.8.10
方案¶
目前常用的方式是Anaconda
+R
(使用apt
安装),而Anaconda
会安装很多不必要的包,而在服务器(无图形界面)使用apt
安装的R
中的画图功能需要安装X11
的相关环境,还不一定能搞定,所以最终采用的方案如下:
1 | ./ |
安装¶
Python相关环境¶
安装虚拟环境¶
1 | python -m venv pycal |
Jupyter初步配置¶
- 生成配置文件
1 | jupyter lab --generate-config |
如果是root
用户,可以在后面添加--allow-root
,完成后会返回配置文件位置。
ValueError: Can not patch loop of type <class 'NoneType'>
这是由于nest_asyncio
的bug导致的,将其版本回退为1.5.1
即可解决。[3]
1 | pip uninstall nest_asyncio |
- 生成密码
1 | (pycal) ~/calhub ❯❯❯ ipython |
- 修改配置
修改配置文件,路径在2.1
中给出,一般为~/.jupyter/jupyter_lab_config.py
;在这一步后可以启动jupyter lab
,访问http://[ip]:port
进行预览。
1 | c.ServerApp.ip = '0.0.0.0' |
注意要在服务器的管理面板放行相关端口。
R相关环境¶
下载¶
为了避免X11
的配置问题,采用编译安装R
的方式。从CRAN
下载源代码(推荐清华镜像源),将其解压:
1 | wget https://mirrors.tuna.tsinghua.edu.cn/CRAN/src/base/R-4/R-4.1.2.tar.gz |
安装前配置¶
有问题,多看手册:R Installation and Administration
在安装之前,我们需要先通过rsource
目录下的configure
文件生成安装的配置文件,在安装中我们需要指定Cairo
代替X11
环境(--with-x=no
和--with-cairo
),同时指定相应的图片格式(如--with-libpng
代表png
格式),还可以指定R
的安装位置(--prefix=your path
)。运行[1]:
1 | ./configure --prefix=~/calhub/rcal --with-libpng --with-jpeglib --with-libtiff --with-x=no --with-cairo |
在这一步骤前,请先确认服务器上安装有以下包:libcairo2-dev
、libjpeg-dev
、libtiff-dev
、libpng-dev
。
configure: error: No Fortran compiler found
直接安装Fortran
的编译器即可,如sudo apt install gfortran
。
configure: error: –with-readline=yes (default) and headers/libs are not available
安装readline
:sudo apt install libreadline6-dev
configure: WARNING: you cannot build info or HTML versions of the R manuals
这个问题是无法获取R
手册的html版本,通过sudo apt install texinfo
解决。
安装¶
1 | make |
安装后配置¶
- 确认正常
进入R
环境(可以将~/calhub/rcal/bin
加入环境变量),查看cairo
是否启用,各类图片是否支持。
1 | (pycal) ~/calhub ❯❯❯ ./rcal/bin/R |
- 配置
~/.Rprofile
.Rprofile
文件是R
的开始配置文件(Startup Configuration
),一般情况下在用户目录下建立该文件即可,也可以在工作目录或者R
的安装目录编写[2]。通过该文件,我们指定图片默认使用cairo
,安装默认使用清华镜像源。
1 | ## Set default 'type' for png() calls - useful when X11 device is not available! |
- 安装
Cairo
安装Cairo
,并查看是否支持各类图片格式。(未尝试过不安装是否可以)
1 | > install.packages("Cairo") |
ERROR: configuration failed for package ''Cairo'
服务器没有安装cairo
的包,通过sudo apt install libcairo2-dev
解决。
fatal error: X11/Intrinsic.h: No such file or directory
这个包是在编译安装cairo
过程中需要用到的,通过sudo apt install libxt-dev
解决。[4]
Jupyter配置¶
添加R kernel
¶
- 安装依赖包
1 | > install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest')) |
installation of package 'devtools'/'gert'/'phangorn' had non-zero exit status
通过单独安装某个包(例如install.packages("devtools")
)的方式,可以获取报错,发现都是因为git2
导致的,通过sudo apt install libgit2-dev
解决。[5]
- 安装
kernel
1 | > devtools::install_github('IRkernel/IRkernel') |
这一步对网络的要求比较高,可以设置代理进行。
Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : 载入了名字空间'rlang' 0.2.2,但需要的是>= 0.3.0
先卸载rlang
包,再重新安装:
1 | > remove.packages(c('rlang'), lib=file.path('包所在位置')) |
- 添加
kernel
1 | # 给自己安装 |
输出会给出kernel
路径,如Installed kernelspec ir in ~/.local/share/jupyter/kernels/ir
。
Nginx配置¶
在完成上述步骤后,可以通过http://ip:port
的方式进行访问,如果需要绑定域名,我们还需要对Nginx进行配置,主要是实现WebSocker
转发。
1 | location / |
服务与插件¶
服务设置¶
为了使Jupyter
在后台长期运行,可以选择使用nohup
,或者使用类似于tmux
的应用,也可以选择创建系统服务:
1 | ## /usr/lib/systemd/system/jupyter.service |
随后运行sudo systemctl daemon-reload
重载以下,后面就可以通过以下命令控制Jupyter
:
1 | sudo systemctl start jupyter # 启动 |
插件安装¶
Jupyter Lab
拥有众多的插件,在左侧的Extension Manager
中可以对插件进行管理。目前安装了两个较为需要的插件。
lsp¶
Coding assistance for JupyterLab (code navigation + hover suggestions + linters + autocompletion + rename) using Language Server Protocol
- 首先安装插件本体:
1 | pip install 'jupyterlab>=3.0.0,<4.0.0a0' jupyterlab-lsp |
- 根据需要安装
LSP language server
,例如我需要Python
以及R
语言:
1 | pip install 'python-lsp-server[all]' |
- 重启
Jupyter Lab
服务
system-monitor¶
- 安装插件本体:
1 | pip install jupyterlab-system-monitor |
- 修改
Jupyter
配置~/.jupyter/jupyter_lab_config.py
:
1 | # memory |
- 修改插件配置:在
Settings
中选择Advanced Settings Editor
,找到System Monitor
,在右侧写入自己的配置:
1 | { |
附录¶
演示¶
requirements
内容¶
1 | numpy |
保存文件失败¶
- 防火墙设置
宝塔的专业版防火墙和免费Nginx防火墙都有POST最大参数限制,查看错误日志(如/www/wwwlogs/free_waf_log/
)发现有参数值长度超过20w已被系统拦截
的字样,则说明防火墙出现问题,修改/www/server/free_waf/init.lua
中的200000
为更大的数字即可。
websocket
问题
可参考官方推荐配置:
1 | map $http_upgrade $connection_upgrade { |
- 权限问题
请确认运行jupyter lab
的用户拥有.ipynb
文件的读写权限。