云服务器远程Jupyter通过Docker Nginx转发到80端口子路径

最近开始学机器学习,故利用手头的云服务器搭建一个远程Jupyter,并且想把Jupyter默认的8888端口代理到80,而且还需要兼容其他80端口的服务,所以需要用到Nginx代理

环境配置

Anaconda

安装包可以去这里下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

# 下载好了以后安装:
bash Anaconda3-2020.02-Linux-x86_64.sh
# 之后一步步同意就安装完成了
# 刚安装上可能环境变量还没有更新,手动更新
source ~/.bashrc

使用清华源的教程
https://mirror.tuna.tsinghua.edu.cn/help/anaconda/

Docker

引用我之前写过的一篇教程,里面包含Docker安装及换源的步骤
https://www.jianshu.com/p/f6d086ffd2af

云服务器

我用的是阿里云服务器,记得把安全组80端口打开

Nginx代理

安装

docker pull nginx

创建所需文件夹

mkdir -p ~/nginx/conf ~/nginx/log

将默认配置文件拷贝出来

# 先运行一个容器
docker run nginx
# 查看容器
docker ps
# 将容器里的默认配置文件拷贝出来
docker cp 容器ID:/etc/nginx/nginx.conf ~/nginx/conf/nginx.conf
# 删除容器,之后启动的容器需要其他设置
docker stop 容器ID
docker rm 容器ID

查看容器内宿主机对应的IP地址

ifconfig

# 输出结果中找到这段,172.17.0.1就是宿主机IP
docker0: flags=4163  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

修改配置文件

只需要修改server配置项

vim ~/nginx/conf/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    
    server {
        # 监听80端口
        listen 80;
        charset utf-8;
        # 绑定的域名或者IP
        server_name www.xxx.xxx;
        # 通配子路径
        location ^~/jupyter {
             # 转发到宿主机对应端口(Jupyter默认8888),IP就是刚刚找到的那个
             proxy_pass http://172.17.0.1:8888;
             proxy_redirect default;
            
             # 之前配置好以后发现连接不上python服务器,控制台发现websocket协议不通
             # 配置转发websocket需要的设置就可以了
             proxy_set_header X-Real_IP $remote_addr;
             proxy_set_header Host $host;
             proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;
             proxy_http_version 1.1;
             proxy_set_header Upgrade $http_upgrade;
             proxy_set_header Connection 'upgrade';
        }
    }
}

参考文章:nginx配置websocket转发功能

启动Nginx

# 运行nginx容器
docker run -d -p 80:80 --name nginx-web-proxy -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/log:/var/log/nginx  nginx
# 查看是否成功启动
docker ps

Jupyter服务

创建所需文件夹

# notebook为笔记存放的根路径
mkdir -p ~/jupyter/notebook ~/jupyter/log
# 开放权限
chmod 777 ~/jupyter/notebook

修改配置文件

# 生成默认配置文件
jupyter notebook --generate-config
# 打开配置文件
vim ~/.jupyter/jupyter_notebook_config.py
# 需要解除注释并修改的地方有:
# 允许跨域访问
c.NotebookApp.allow_origin = '*'
#根路径与nginx子路径对应
c.NotebookApp.base_url = '/jupyter'
# 绑定本地IP
c.NotebookApp.ip = '0.0.0.0'
# 笔记存放根路径
c.NotebookApp.notebook_dir = '/root/jupyter/notebook'
# 无需启动打开浏览器
c.NotebookApp.open_browser = False
# 绑定端口,默认就是8888,可不修改
c.NotebookApp.port = 8888

设置密码

jupyter notebook password

启动Jupyter

# 后台常驻
nohup jupyter notebook --allow-root > jupyter/log/jupyter.log &
# ctrl + c 退出
# 查看是否成功启动
netstat -ap | grep 8888

访问远程Jupyter

大功告成,地址栏输入{IP或域名}/jupyter,就会自动跳转到登录页面

个人博客地址:http://qiyubing.cn

你可能感兴趣的:(云服务器远程Jupyter通过Docker Nginx转发到80端口子路径)