ldap认证jupyter notebook
虽然jupyter hub是支持ldap的,见ldapauthenticator;
但是登录成功后似乎要以登录用户名启动notebook,而登录用户在服务器上不存在,于是500了;
在服务器上通过pam/nss进行ldap验证?别逗了,谁要那么干啊。
于是转换思路,核心仿照这篇博客:docker+centos7+nginx1.2.0+ldap +jupyter实战;
1. 首先,编译一个带nginx-auth-ldap认证模块的nginx,做为notebook server的proxy,做进一个docker容器里,以后可以复用;
1.1 下载nginx 1.14.0和nginx-aut-ldap模块,编译,没啥特别;
./configure --add-module=../nginx-auth-ldap && make && make install
1.2 配置nginx,proxy_pass的主机名写成notebook;寻址问题交由docker-compose帮忙解决;
websocket的这段配置比较关键,决定了是否能正常执行ipynb notebook文件;
location ~* /(api/kernels/[^/]+/(channels|iopub|shell|stdin)|terminals/websocket)/? { proxy_pass http://notebook:8888; proxy_set_header Referer http://proxy:8000; # websocket support proxy_http_version 1.1; proxy_set_header Upgrade "websocket"; proxy_set_header Connection "Upgrade"; }
1.3 nginx做进systemd,开机启动;
# cat /usr/lib/systemd/system/nginx.service [Unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
接下来,notebook server在另一个docker容器里,于是需要把两个docker容器连在一起管理,用了一下docker-compose;
2.1 安装docker-compose:
pip install docker-compose pip install docker_pycreds # 解决 python2.7 ImportError: No module named urllib.parse
2.2 写docker-compose.yml
几个细节:
- proxy links notebook,这样nginx配置文件中proxy_pass的地址可以直接使用notebook做主机名;
- notebook expose 8888,把notebook的8888端口只暴露给proxy用,避免被绕过proxy;
3. 配置jupyter notebook
3.1 配置jupyter notebook
c.NotebookApp.token = '' #把token置空,不在notebook这里做认证管理了 c.NotebookApp.allow_root = True #允许docker内用root启动 c.NotebookApp.allow_origin = '*' # 因为notebook和proxy在两个docker内,写上这条配置以允许CORS(Cross-Origin Resource Sharing, 跨源资源共享)
3.2 把jupyter notebook放进systemd,允许开机启动
# cat /lib/systemd/system/jupyter.service [Unit] Description=Jupyter Notebook [Service] Type=simple ExecStart=/run_jupyter.sh [Install] WantedBy=multi-user.target
# systemctl enable jupyter
4 启动几个容器
docker-compose up -d
5 进入notebook以后,发现点quit按钮,不仅退出notebook了,而且会让jupyter notebook进程直接结束;
稍微看了一下代码,发现有一个配置可以隐藏quit按钮,于是给jupyter加了一条配置:
c.NotebookApp.quit_button = False
这样多人登入同一个jupyte,然后一人一个notebook,应该不会互相打架吧。反正人少,打就打吧。
jupyterhub spawner?等它发展发展再说,现在来看技术栈太深了些。