在服务器上搭建 Jupyter Notebook

Jupyter Notebook

安装Jupyter

假定工作目录为/home/jupyter

1
2
3
$ virtualenv venv -p python3
$ source venv/bin/activate
$ (venv) pip install jupyter

配置Jupyter

安装Jupyter之后,在~/.jupyter下查看是否存在jupyter_notebook_config.py文件,如果没有,就使用

1
$ (venv) jupyter notebook --generate-config

命令生成配置文件,Jupyter的具体配置内容参见Jupyter Notebook的配置选项,下边的几个选项是为部署在服务器上可能要用到的(下边c.NotebookAPP.password的设置方法见Jupyter Notebook添加密码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Nginx访问时会出现跨域访问,需要在这里允许
c.NotebookApp.allow_origin = '*'
# 禁止随意修改密码
c.NotebookApp.allow_password_change = False
# 是否允许远程访问
c.NotebookApp.allow_remote_access = True
# 访问URL,假定我们想通过`$HOST/python`来访问
c.NotebookApp.base_url = '/python'
# 访问之后跳转的URL(自定义),要加上base_url
c.NotebookApp.default_url = '/python/tree'
# Jupyter Notebook Server监听的IP
c.NotebookApp.ip = '127.0.0.1'
# Jupyter Notebook的工作目录,用于限制访问位置
c.NotebookApp.notebook_dir = 'data/'
# 启动Jupyter Notebook之后是否打开浏览器(服务器上此选项应该关闭)
c.NotebookApp.open_browser = False
# 客户端打开Jupyter Notebook的密码哈希值
c.NotebookApp.password = 'sha1:******'
# Jupyter Notebook Server监听的端口
c.NotebookApp.port = 8888

集成 Nginx

Jupyter Notebook使用tornado作为服务器和Web框架,如果想要获取更高的性能以及灵活性,可以使用Nginx作为代理服务器。在/etc/nginx/conf.d/jupyter.conf中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80 default_server;
server_name myjupyter.com;
charset utf-8;
client_max_body_size 75M;

location /python/ {
# 这里要和Jupyter配置中的Base Url一致
proxy_pass http://127.0.0.1:8888/python/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
# 因为用到了Websocket协议,所以下边的配置是必须的
proxy_set_header Connection "upgrade";
proxy_redirect off;
}
}

配置完成之后,启动Jupyter Notebook即可远程访问

1
2
3
4
# 直接运行,测试使用
$ (venv) jupyter notebook
# 后台运行
$ (venv) nohup jupyter notebook &

此时在浏览器输入http://myjupyter.com/python即可进入Jupyter Notebook。