jupyterhub nginx proxy pass----ipv6转ipv4实现内网穿透

jupyterhub

很多人应该已经对jupyter和notebook已经有所了解了。如果是多人共享服务器的话,就需要用到jupyter的多用户版本jupyterhub。jupyterhub架构如图所示。jupyterhub

需求背景

大多数实验室生成环境一般处于学校内网当中,然而一般在学校中,一般只允许内网访问。但是,教育网一般都有原生ipv6的ip。所以就有一个想法,通过云服务器作为中转,给服务器做代理,实现ipv4外网访问。

需求

  • 处于内网的实验室服务器一台,具有ipv6公网ip
  • 阿里云服务器ECS一台,需要有ipv6的实例

连接架构

  • 阿里云ECS-->实验室服务器 ipv6
  • 你的电脑-->阿里云ECS nginx端口 ipv4
    这样就可以实现随时随地访问实验室服务器的jupyterhub服务。

实现

服务器端

jupyterhub --ip  [::0] --port 8888 --NotebookApp.allow_origin='*' --config=./jupyterhub_config.py

其中jupyterhub_config.py 中配置了SSL证书,实现https访问。
上述参数代表所有ipv4和ipv6网段ip均可访问。

ECS端

nginx.conf 配置如下:

    server{
        listen  8888 ssl http2 default_server;
        ssl_certificate xxxxxxxxx.pem;
        ssl_certificate_key xxxxxxxxxx.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;
 
        include /etc/nginx/default.d/*.conf;
        index  index.php index.html index.htm;
        location / {
            proxy_pass  https://[实验室ipv6 ip]:8888;
            #websocket terminal
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
            proxy_set_header Host $host;
            proxy_http_version 1.1; 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header Upgrade $http_upgrade;  
            proxy_set_header Connection "upgrade"; 
            proxy_set_header Origin "";
        }
        # Managing requests to verify letsencrypt host
        location ~ /.well-known {
            allow all;
        } 
    }

注意事项:

  • jupyterhub如果配置了https,则nginx也必须配置https。否则会无法set cookie,导致一直卡在login界面。

  • websocket的配置参考了官网方案。但是没啥用,所以又看了一篇关于nginx转发带websocket应用的文章。综合考虑,终于解决了转发后无法打开terminal的问题。

  • dhparam.pem文件可能不存在,需要使用openssl生成。

posted @ 2020-02-13 16:49  fahaizhong  阅读(1605)  评论(0编辑  收藏  举报