「曲线救国」 在 VPS 上跑 Jupyter 「Hub」

警告
只是临时办法,适用于小规模(几个人)
人多了,配置起来太累

具体操作

因为在我的 VPS 上 Jupyterhub 出于各种诡异的原因,始终不能正常运行,所以只能以一种伪hub方式实现,即给每个人提前配置好相应地 Jupyter Notebook。原理如下:

技术细节参考这篇文章 远程访问jupyter notebook

  1. 在 root 账户下,安装所需的各种包(numpy,pandas,tensorflow....)
  2. 各个账户照常建 sudo adduser user01
  3. 进入每个账户下,配置密码的哈希值
    • jupyter notebook --generate-config 生成 Jupyter Notebook 配置文件
    • ipython 1
      • from notebook.auth import passwd
      • passwd() 输入密码 保存好密码!!!
      • 'sha1:02fa............' 保存好这个字符串
      • quit() 推出 ipython
    • 执行指令 vi ~/.jupyter/jupyter_notebook_config.py
    • 添加这么一行:c.NotebookApp.password = u'sha1:02fa............',如有需要再分配端口:c.NotebookApp.port =port port 可以是 8888,8886,8880,随意,只要别冲突
      • vi 不熟悉的这按如下流程么操作
      • 单击按键 i
      • 粘贴你的 c.NotebookApp.password = u'sha1:02fa............'
        • 如果有需要,回车键,粘贴 c.NotebookApp.port = port port 是什么看上边
      • 单击 Esc 就在键盘左上角
      • 输入 :wq 保存并推出
  4. 在新的终端里激活 user01 的 jupyter notebook:(多个终端,用着用着就忘了哪个是哪个了)
    • ssh user01@ip
    • screen jupyter notebook screen 命令可以让 jupyter notebook 常驻后台,而不会因为 ssh 的关闭而推出
  5. 在 user01 的电脑上执行ssh指令 ssh user01@ip -L127.0.0.1:1234:127.0.0.1:port。此时 user01 的电脑进入 http://127.0.0.1:1234 就可以了

备注

  1. 如果需要加密连接,配置文件加入你的证书和key的位置。嗯,我用的是我给 hub 准备的证书(自己给自己签发)

代码中的目录只是出于演示目的
实际操作中,普通用户无法访问 /etc/ssl/private/ 目录

签发证书,目录自己选。记住即可

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/jupyterhub.key -out /etc/ssl/certs/jupyterhub.crt

在 jupyter/jupyter_notebook_config.py 中添加这两行

c.NotebookApp.certfile = u'/etc/ssl/certs/jupyterhub.crt'
c.NotebookApp.keyfile = u'/etc/ssl/private/jupyterhub.key'

浏览器打开时会报警,macOS 上信任,并添加到钥匙串即可
其实也不必担心流量被监听:ssh 隧道本身就是加密的(不过其中的流量类型是可以被深度识别的 2

  1. 没人会想经常进终端输入指令,所以执行 ssh 之前添加 screen 即可。终端就算关了,ssh 隧道也会在后台老老实实地执行转发流量,很省心
  2. 有时候 screen 开的进程忘记关了,程序的端口会开始抢,这三个指令能把 screen 开启的进程全部杀掉了
screen -ls | grep -i detached | cut -d. -f1 | tr -d [:blank:]| xargs kill
screen -ls | grep Detached | cut -d. -f1 | awk ‘{print $1}| xargs kill
screen -ls | grep -o "[0-9]\{5\}" | xargs kill

后记

可以看到,这个方法和 Jupyterhub 的配置过程相比,麻烦了许多(如果配置一次成功的话)。只是少许人用,还能凑活着用。人多了,工作量想想就头大。何况 Hub 还可以有如 GitHub 这样的验证方式。Hub 的白名单等功能真的是太好用了

另外,Windows 操作系统时至今日也没有集成 ssh 命令,很奇怪哈。安装 OpenSsh 即可


  1. 这里默认给每个用户的 Jupyter Notebook 设置密码。因为实际中,不设置秘密,Jupyter 就会生成一个 Token,没有这个 Token 是无法登陆的。而为了方便用户使用,用户只需要打开 SSH 隧道,输入固定的密码即可,再去输入 Token,会带来不必要的麻烦  

  2. [孟姣, 王丽宏, 熊刚, 等. 基于机器学习的 SSH 应用分类研究[J]. 计算机研究与发展, 2012 (S2): 153-159.] 3  

Comments
Write a Comment