项目内部iframe嵌套jupyterhub for k8s
介绍:Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍jupyterhub是多用户版本的notebook,是在jupyter notebook基础之上又提供了一层服务。直接面向jupyterhub开发,可以更方便的区分用户jupyterhub for k8s,是在kubern
介绍:
- Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍
- jupyterhub是多用户版本的notebook,是在jupyter notebook基础之上又提供了一层服务。直接面向jupyterhub开发,可以更方便的区分用户
- jupyterhub for k8s,是在kubernets上运行jupyterhub,可以更方便的进行容器编排与资源调度。而这些复杂的底层操作都交给它来实现了。
nginx代理
在chrome某个版本之后,由于对iframe内跨域cookie的限制,使这里的嵌套无法调通。
于是想通过nginx配置反向代理,增加location匹配规则,配置为同域来解决这个问题。
通过这种方式,可以不需要改动jupyterhub for k8s那里的配置即可。
location /user/ {
proxy_pass http://{这里是jupyterhub for k8s的安装地址}/user/;
proxy_hide_header content-security-policy;
add_header Content-Security-Policy 'frame-ancestors https://我的域名' always;
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_set_header X-Real-Scheme $scheme;
# websocket headers
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_buffering off;
}
location /hub/ { # 这个配置只是为了取得左上角的logo,但是后面会把这个logo去掉,那就没什么用了
proxy_pass http://{这里是jupyterhub for k8s的安装地址}/hub/;
proxy_set_header Content-Security-Policy "frame-ancestors http://我的域名:82 http://{这里是jupyterhub for k8s的安装地址}";
proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# proxy_redirect off;
}
注意listen的端口需要为80,否则编辑器是可以显示出来了,但是会提示内核无法初始化。通过控制台可以发现是因为一个post的sessions接口报404,而通过和正常访问的页面对比也没什么不同
配置ssl
注意这里的端口必须是443,否则也是无法初始化内核。
listen 443 ssl;
server_name 我的域名;
ssl_certificate /etc/nginx/cert/文件名.pem; #需要将cert-file-name.pem替换成已上传的证书文件的名称。
ssl_certificate_key /etc/nginx/cert/文件名.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#表示使用的加密套件的类型。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
ssl_prefer_server_ciphers on;
这样就可以解决了。
修改notebook模板
另外如果想要修改模板文件,/opt/conda/lib/python3.8/site-packages/notebook/templates
下的html改动即可。
404.html
browser-open.html
edit.html
error.html
login.html
logout.html
notebook.html
page.html
terminal.html
tree.html
view.html
在jupyterhub中比notebook多了一个“Control Panel”的按钮,这个按钮生成的来源在/opt/conda/lib/python3.8/site-packages/jupyterhub/singleuser/mixins.py
修改之后需要重启jupyterhub或者docker容器才能生效。
关于暂时端口使用的结论
只有默认的80端口和443端口可以,必须是http或https的默认隐式端口,其它的显式声明端口就不行。
最早的时候用nginx配,就是因为这个问题导致这个内核无法初始化。
表现出来是post/user/caoyj/api/sessions
这个接口404
,看发送的数据及头信息,和直接访问的数据及头也看不出区别
如果能到容器内找到这个接口的代码,解决掉这个问题也行。
解决端口限制问题
原来这一部分我以为只判断Referer,当时在nginx也配置了referer没用,因为原来判断跳转来源都是根据浏览器携带的这个参数。
这会儿在nginx中又增加了Origin和Host的配置,就可以了
proxy_set_header Referer ‘http://我的域名’;
proxy_set_header Origin ‘http://我的域名/’;
proxy_set_header Host ‘我的域名’;
按这种方式处理后,不再限制端口了.
而且上次处理后,那个“可信”还显示的“不可信”,虽然不影响使用,也能点击手动信任,并且从容器模板中也能去掉。
但是现在这样处理后直接就是可信了
更多推荐
所有评论(0)