简介

使用效果及介绍可以参考 这篇文章 或者 官方网站

最近闲暇练手的时候在用Python写一些小的玩具程序,因为经常更换设备,如何同步环境、代码乃至运行状态就成了一个头疼的问题。

在搜索引擎换用了各种关键字搜索之后,终于找到一个解决方案,Jupyter Notebook,安装起来也很简单,只需要简单的几句命令:

pip3 install jupyter
jupyter notebook

就能将Jupyter Notebook运行起来,如果是在有图形环境的本地电脑运行,应该会直接打开浏览器或者弹出url。

搭建

但是由于我打算把Jupyter Notebook部署到互联网的一台VPS上以便于不同设备在不同网络环境下使用,因此需要进行一些安全方面的设置。

首先创建一个非特权的notebook用户并切换到该用户来运行Notebook。

adduser notebook

接下来需要对Notebook进行一定的配置。

首先通过命令

jupyter notebook --generate-config

创建一个配置文件,Linux下默认的位置在~/.jupyter/jupyter_notebook_config.py,然后编辑其中的IP地址,端口,密码等设置项。

博主修改的项目如下:

c.NotebookApp.allow_remote_access = True
c.NotebookApp.notebook_dir = '/home/notebook/notebook_dir'
# 密码可以通过 python 中执行 from notebook.auth import passwd; passwd() 生成
c.NotebookApp.password = 'sha1:e5xxxxxxxxc3:94bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7'
c.NotebookApp.port = 8888
c.NotebookApp.ip = '0.0.0.0'

最后,通过supervisor运行并监控Notebook程序,配置文件如下:

[program:notebook]
command=/home/notebook/.local/bin/jupyter notebook
autostart=true
autorestart=true
user=notebook
log_stderr=true
logfile=/var/log/notebook.log

其他

添加virtualenv支持

virtualenv是python下常用的虚拟环境管理工具,为Notebook添加virtualenv支持也很简单,只需要添加对应kernel即可。

比如添加一个名为foobar的虚拟环境:

virtualenv foobar
source foobar/bin/activate
pip3 install ipykernel
python -m ipykernel install --name foobar --user

在Notebook中执行bash命令或pip安装

目前没有想到什么好的方法,只能手动在Notebook中运行

!/home/notebook/foobar/bin/pip install requests

Nginx反代Notebook

Nginx反代Notebook配置文件如下:

upstream notebook {
  server localhost:8888;
}

server {
  listen 80;
  listen [::]:80;
  server_name notebook.example.com;

  location / {
    include snippets/real_ip.conf;
    proxy_pass http://notebook;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Read-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";
  }
}

重点在于这三行,使Nginx支持WebSocket反代

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";