Jupyter Notebook 是科学计算必备工具之一,它是一个开源的web应用程序,允许你创建和共享实时代码,可以用来进行数据清理和转换、统计建模、数据可视化、机器学习等等工作。
下面是使用supervisour和nginx来部署公开jupyter notebook服务过程。
安装jupyter notebook
推荐python3环境下安装jupyter。我系统是Ubuntu 18.04
里面内置了python3,所以直接安装jupyter,如果系统python版本是python2.7,可以使用virtualenvwrapper
进行多版本python管理。
下面使用pip来安装jupyter notebook
1 | sudo apt-get install python3-pip // 安装pip3 |
**注意:**jupyter是单用户服务,如果想使用多用户服务可以使用jupyterhub
配置jupyter notebook
生成配置文件
下面命令将在~/.jupyter
目录下面生成jupyter notebook
配置文件jupyter_notebook_config.py
1 | sudo jupyter notebook --generate-config |
修改jupyter_notebook_config.py
文件中以下配置:
1 | c.NotebookApp.ip = 'localhost' // jupyter监控地址 |
配置登录密码
jupyter启动服务时候,默认是使用一次性token进行登录验证的。我们需要使用以下命令来给jupyter服务配置登录密码:
1 | sudo jupyter notebook password |
按照提示输入密码,再次确认密码就可以了。这条命令需要jupyter notebook版本不小于5.0才支持。若不支持可以按照下面方式来配置,详细见官方文档:
在python交互模式下,输入以下命令
1 | >>> from notebook.auth import passwd |
然后复制上面的hash处理之后的字符串到~/jupyter_notebook_config.py
1 | c.NotebookApp.password = u'sha1:5952f1c3c7ec:16852a1f8ee36f7cb716b74d3e0127efee106c1c' |
启动服务并验证
配置完成之后我们可以使用jupyter notebook
来启动服务
1 | cd /home/vagrant/jupyter // 假定jupyter工作目录在~/jupyter |
由于jupyter是在远程服务器上面启动,监听的是127.0.0.1地址,外面无法访问,这时候我们可以使用ssh本地转发功能,将远程内网服务转发至本地端口。下面我们在本地执行以下命令(若window下面没有ssh命令,可使用xshell):
1 | ssh -N -f -L 9999:localhost:8888 remote_user@remote_host |
其中-N表示仅做端口转发,不执行任何命令。-f表示在后台运行。-L表示本地转发,其选项值代表ssh客户端和服务端转发的端口,9999为本地监听端口, localhost和8888为远程jupyter服务地址和端口。remote_user@remote_host代表远程主机用户和地址。
完成上面操作,打开浏览器,地址栏输入localhost:9999
,即访问的是远程的jupyter。
ssh端口转发只是来测试jupyter服务功能,接下来继续部署公开jupyter服务。
配置Supervisor
Supervisor是python语言写的进程服务管理工具。为了保证jupyter notebook在不可用时候自动重启,使用supervisor来监控jupyter服务。
下面命令用来安装supervisor
1 | sudo apt-get install supervisor |
然后复制到以下配置到/etc/supervisor/conf.d/jupyter.conf
1 | [program:jupyter] |
加载上面配置到supervisord
1 | sudo supervisorctl reread // 重新读取配置 |
使用下面命令来查看jupyter状态
1 | sudo supervisorctl status |
配置Nginx
nginx安装过程略。nginx配置如下:
1 | server { |
上面配置简单说明:由于jupyter客户端执行命令时候,是使用webscokets来和服务端进行通信,为了让Nginx可以将来自客户端的Upgrade请求发送到后端jupyter,Upgrade和Connection的头信息必须被显式的设置。
重新加载nginx配置文件
1 | sudo nginx -t // 测试nginx配置语法是否ok |
最后打开浏览器访问jupyter.example.com
就可以使用jupyter了。