项目内部iframe嵌套jupyterhub for k8s

介绍:

  • Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发、文档编写、运行代码和展示结果。——Jupyter Notebook官方介绍
  • jupyterhub是多用户版本的notebook,是在jupyter notebook基础之上又提供了一层服务。直接面向jupyterhub开发,可以更方便的区分用户
  • jupyterhub for k8s,是在kubernets上运行jupyterhub,可以更方便的进行容器编排与资源调度。而这些复杂的底层操作都交给它来实现了。

在chrome某个版本之后,由于对iframe内跨域cookie的限制,使这里的嵌套无法调通。
于是想通过nginx配置反向代理,配置为同域来解决这个问题

  location /user/ {
    proxy_pass http://{这里是jupyterhub for k8s的安装地址}/user/;
    proxy_hide_header content-security-policy;
    add_header Content-Security-Policy 'frame-ancestors https://206.d.gdatacloud.com' 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://experi.zzu.gdatacloud.com: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;
  }

这样配置之后,编辑器是可以显示出来了,但是会提示内核无法初始化。通过控制台可以发现是因为一个post的sessions接口报404,而通过和正常访问的页面对比也没什么不同

解决办法就是配置ssl,这里注意的一点就是,

  listen 443 ssl;
  server_name experi.zzu.gdatacloud.com;
  server_name 206.d.gdatacloud.com;
  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;

这样就可以解决了。
通过这种方式,可以不需要改动jupyterhub for k8s那里的配置即可。

另外如果想要修改模板文件,/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容器才能生效。

上一篇:JVM-JDK8-G1垃圾收集器相关参数


下一篇:Nginx映射本地静态资源时,浏览器提示跨域问题解决