在 Linux VPS 上搭建云端 Jupyter Notebook

相信用过 Jupyter Notebook 的朋友们都知道这个工具的方便和强大。它采用了后台+web端的方式运行,既有可视化的界面,又有web端的灵活。
正常情况下,我们都是在本地运行 Jupyter Notebook,打开一个服务进程,然后在浏览器中访问 Jupyter Notebook。不过,对于拥有 VPS 的朋友们来说,怎么能浪费这么有利的运行方式?当然是把它部署到云端,随时随地通过浏览器来写代码、运行代码啦。
因此,今天我们来看看如何在 Linux 平台的 VPS 上搭建可以远程访问的 Jupyter Notebook。

一、安装 Jupyter Notebook

我们可以使用 pip 来安装 Jupyter,不过由于 Jupyter 的依赖较多,安装过程可能会有一些问题需要处理。
也可以直接安装 Anaconda 这个项目,十分简单方便,一步到位。Anaconda 包含了 Python、Jupyter Notebook 以及常用的科学计算包。
我们这里通过安装 Anaconda 来安装 Jupyter Notebook,Python 版本为 2.7。
在 Anaconda官网 下载安装包,得到文件 Anaconda2-4.4.0-Linux-x86_64.sh
在 Linux 命令行中输入
$ bash Anaconda2-4.4.0-Linux-x86_64.sh
注意,无论你使用的终端是否是 bash,命令中的 bash 都不能少。执行该文件后,跟随向导一步一步安装就可以了。

二、设置 PATH 环境变量

安装完 Anaconda 之后,需要先配置环境变量,才能直接使用 pythonjupyter notebook 等命令。
打开用户目录下的 .bashrc 文件,添加下面的命令:
export PATH=/wray/anaconda2/bin:$PATH
我的 anaconda 安装目录为 /wray/anaconda2/,大家可以根据自己的安装路径修改该命令。
重新登陆终端,就能打开 python 和 jupyter notebook 了。

三、设置 Jupyter 配置文件

Jupyter Notebook 运行需要一些参数,例如登录密码、默认目录、SSL认证等等。
Jupyter 默认不允许直接使用 root 用户运行 Jupyter Notebook,最好是新创建一个用户帐户。如果一定要用 root 账户运行的话,在下面的生成密码这一步中,需要采用第二种方式手动生成密码。

生成密码

我们需要生成经过加密的密码。
$ jupyter notebook password
Enter password:  ****
Verify password: ****
[NotebookPasswordApp] Wrote hashed password to /Users/you/.jupyter/jupyter_notebook_config.json
密码将被保存到 ~/.jupyter/jupyter_notebook_config.json 这个文件中。
也可以手动生成密码:
$ python
>>> from notebook.auth import passwd
>>> passwd()
Enter password:
Verify password:
'sha1:a52b35d305df:c8339cf14bf4f0a8f745c1d1041ec87c03282221'

生成SSL证书

该步骤的目的是采用 HTTPS 连接远程访问 Jupyter Notebook,增加安全性,非必须。
在 ~/.jupyter/ 目录下执行以下命令:
$ openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mykey.key -out mycert.pem
生成的 mykey.key 和 mycert.pem 文件将被保存到 ~/.jupyter/ 目录中。
需要注意的是,由于我们自己制作的SSL证书没有被权威机构认证,所以通过浏览器访问时会提示不安全,只需要添加信任并继续访问即可。
这里有一个问题,是关于 ios 系统的。就是当我采用了 SSL 认证,即 HTTPS 访问时,Windows 平台和 Android 平台都能够正常访问并使用 Jupyter Notebook。但是使用 ios 平台访问时,能够登陆 Jupyter Notebook,并且可以打开和编辑文件,但始终提示 Connecting to kernel,即无法连接到 python 解释器内核,因此没办法执行代码。去掉SSL认证之后,ios 才能成功连接到内核。SSL认证的设置在下文中讲述。

生成配置文件

生成默认的 Jupyter 配置文件:
$ jupyter notebook --generate-config
我们可以在 ~/.jupyter 目录中看到 jupyter_notebook_config.py 文件,该文件用于配置 Jupyter Notebook 的运行参数。
然后打开该文件,添加以下配置:
# 设置默认目录
c.NotebookApp.notebook_dir = u'/defult/dir/'
# 允许通过任意绑定服务器的ip访问
c.NotebookApp.ip = '*'
# 用于访问的端口
c.NotebookApp.port = 9999
# 不自动打开浏览器
c.NotebookApp.open_browser = False
# 设置SSL认证
c.NotebookApp.certfile = u'/path/to/.jupyter/mycert.pem'
c.NotebookApp.keyfile = u'/path/to/.jupyter/mykey.key'
# 设置登录密码
c.NotebookApp.password = u'sha1:28436903e41b:e36a5f61317d4f515d46178a81834b20ae60d57b'
如果不设置默认目录,则起始目录就是执行 jupyter notebook 命令时所在的工作目录。
在 Linux 中,非 root 用户无法监听 1024 以内的端口号。
在终端中执行 jupyter notebook,如果是 root 用户,则需要加上 --allow-root 选项。此时,若是没有其它问题出现,你就可以通过你的域名和端口号 https://domain.com:9999 来访问 Jupyter Notebook 了。
注意,如果采用了 SSL 认证,则访问的网址中必须以 https 开头,表示采用 https 连接方式,否则无法访问。

不挂起后台运行

我们希望即使在退出终端后,Jupyter Notebook 依然在后台运行,仍然可以通过远程被访问。
我们可以使用 nohup command & 来实现,nohup 命令会忽略所有的挂起信号,确保命令在后台长期执行。
nohup jupyter notebook > jupyter.log &
这里我们将标准输出定向到 jupyter.log 文件中,如果不指定该文件,则默认定向到 nohup.out 文件中。
接下来,就尽情地享受云端 Jupyter Notebook 所带来的便捷吧!