nginx + jupyter的服务端部署
我们都知道在本地安装部署jupyter,之后可以执行命令
jupyter notebook
可以打开浏览器可视化操作编程环境,那么我们如何在本地去访问我们的服务端呢?下面我先列出一些效果图来讲述我搭建的整个流程。
下图是我从登录jupyter到进入到jupyter主页的演示图
jupyter主页其中说明如下几点:
- ①是登录jupyter主页
https://js.jupyter.com/jupyter
时,弹出的登录验证页面; - ②是表示该请求是一个https请求;
- ③是表示jupyter的资源主页路径是
jupyter
; - ④是表示在jupyter的notebook的路径下的目录文件列表信息;
那么为了上述列出的这四点是如何实现?或者说是哪些配置信息决定了上面的显示呢?
1. notebook的认证
为了实现上面的认证效果,其实就是对服务器上的jupyter notebook环境的权限认证。下面介绍一下我们如何对自己启动的jupyter服务,从设置权限,到验证权限的流程。
- 首先是设置权限,通过执行命令:
jupyter notebook --generate-config
,会创建目录~/.jupyter
并且该目录下会有一个配置文件jupyter_notebook_config.py
,通过设置如下配置项:
c.NotebookApp.base_url = '/jupyter' # 设置jupyter的资源主页路径,即[jupyter主页]图片中的③
c.NotebookApp.ip = '127.0.0.1' # 设置了访问该jupyter应用的来源机器只能是本机
c.NotebookApp.open_browser = False # 设置了关闭浏览器
c.NotebookApp.password = u'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb' # 这就是实现认证的关键所在,即用户在浏览器中输入一个密码,如何和服务器上"正确"的匹配上,这个字符串的获取,需要通过其他命令获取
c.NotebookApp.port = 8888 # 设置了jupyter服务的端口
c.NotebookApp.notebook_dir = u'/data/home/user00/js_python' # 设置了jupyter的notebook路径,即访问jupyter首页时,看到的文件列表就是该目录下的,如果不设置该项,那么notebook的目录就是 `~/.jupyter`
- 我们在1中看到了用户认证的关键配置项
c.NotebookApp.password
,那么该值我们如何获取呢?可以通过进入到ipython
环境下,执行如下命令获取,其中两次输入的密码,就是我们在浏览器中需要输入的密码,这样就能和服务器上的验证匹配得上了。
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: 'sha1:a937e51de9a1:a567707768cd50d0ac1d40a4fb739510ddb3d8cb'
上面我们只是启动好了jupyter,并且jupyter的服务只能在本机访问,那么我们如何在远程进行链接该服务呢?下面我们介绍使用nginx做服务代理,到本机的jupyter服务上去。
2. nginx代理
我们看到上面图片中的URL请求使用的是https,那么我们如何nginx做到https请求呢?另外我们如何是本地的链接请求代理到远程服务器上的本机jupyter 8888服务呢?下面我们将详细讲解。
- 首先是搭建nginx服务
搭建nginx服务的时候,使用如下命令编译
>> sudo yum install pcre pcre-devel
>> sudo yum install openssl openssl-devel
>> ./configure --prefix=/data/home/user00/app/nginx-1.6.3 --pid-path=/data/home/user00/app/nginx-1.6.3/nginx.pid --with-http_ssl_module
>> make && make install
- 然后设置nginx的启动配置
下图中的①是用来设置jupyter的请求是https
请求作用使用的,端口是443,然后还有ssl鉴权认证,其中文件cert.crt
和cert.key
获取的方法如下,执行如下命令,然后在本目录下会生成这两个文件,将其拷贝到目录/data/home/user00/app/nginx-1.6.3/
即可
>> openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout cert.key -out cert.crt
# 参数说明:
# -x509 # 输出一个x509格式的证书
# -days # x509证书的有效时间
# -newkey rsa:bits # 生成一个bits长度的RSA私钥文件,用于签发
# -keyout # 输出证书key文件
# -out # 输出证书私钥文件
nginx.conf 配置
然后启动nginx的时候,会发现会报如下错误,表示nginx编译的时候,没有加载ssl模块进去,那么我们就需要编译一下nginx,将ssl模块加进去,但是我们不是重新将nginx编译一遍。
nginx: [emerg] unknown directive "ssl_certificate" in /data/home/user00/app/nginx-1.6.3/nginx.conf:86
nginx: configuration file /data/home/user00/app/nginx-1.6.3/nginx.conf test failed
具体操作方法如下:
# step 1 解压nginx包到一个新的目录
# step 2 然后重新编译,但是呢,我们这次只添加我们需要的模块,例如上面的ssl,
# 但是需要保证prefix和pid-path与本机之前编译的nginx这些设置保持一致;
# 注意,这里只执行 make 不要执行 make install
./configure --prefix=/data/home/user00/app/nginx-1.6.3 --pid-path=/data/home/user00/app/nginx-1.6.3/nginx.pid --with-http_ssl_module
make
# step 3 在该路径下会有文件 objs/nginx ,将其拷贝到系统的nginx目录,例如本文中的例子,在拷贝之前最好备份一下旧的nginx
cp objs/nginx /data/home/user00/app/nginx-1.6.3/sbin/nginx
# step 4 重启nginx服务即可
3. 问题处理
下面是问题汇总,在搭建的过程中遇到的问题,进行了汇总。
问题1:
2018/02/02 01:38:41 [error] 16673#0: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 10.32.203.42, server: js.jupyter.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8888/", host: "js.jupyter.com"
解答 :
查看后台的8888服务是否有拉起,发现服务没有起来,通过重新拉起即可解决。
问题2:
2018/02/02 01:21:58 [error] 11207#0: *46 open() "/data/home/user00/app/nginx-1.6.3/html/jupyter" failed (2: No such file or directory), client: 10.32.203.42, server: localhost, request: "GET /jupyter HTTP/1.1", host: "js.jupyter.com"
解答:
这里代理转到jupyter8888服务出现了问题,才会出现去请求 .../html/jupyter
目录资源的问题,需要检查配置中关于代理的设置是否正确
下面是关于使用过程中遇到的问题的汇总。
问题1:
解决:
由于在
from sklearn import linear_model
加载时,出现 scipy
包没有安装的情况;等安装了之后,再次执行上面步骤出现的上面错误,需要重新启动 jupyter服务即可解决
网友评论