Hexo+Jupyter

本文最后更新于:2020年5月23日 下午

本文以域名pxxyyz.com为例。

安装Jupyter

  • 安装Anaconda
$ mkdir anaconda //创建目录
$ cd anaconda    //进入目录
// 在镜像站找到安装包并下载
$ wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2020.02-Linux-x86_64.sh
$ bash Anaconda3-2020.02-Linux-x86_64.sh  //安装anaconda3
  • 生成Jupyter Notebook配置文件
$ jupyter notebook --generate-config
  • 打开ipython并设置登入密码
ipython 
In [1]: from IPython.lib import passwd
In [2]: passwd()                         #设置Jupyter Notebook密码
Enter password: 
Verify password: 
Out[2]: ''                               #生成的密钥在配置文件有用
  • 修改服务器配置文件
$ vim ~/.jupyter/jupyter_notebook_config.py
  • i 键进入文件的编辑模式,在该文件中添加代码,按 Esc 键退出编辑模式,输入:wq 保存退出。(先输入:,然后输入wq回车)
# 设置所有ip地址皆可访问
c.NotebookApp.ip='*' 
# 输入密码的哈希值,见Out[2]
c.NotebookApp.password = u'sha1:XXX'
# 禁止自动打开浏览器
c.NotebookApp.open_browser = False  
# 指定端口,需要在服务器安全组开发该端口
c.NotebookApp.port =8888 
# 远程访问
c.NotebookApp.allow_remote_access = True 
# 使用mathjax,可输入公式
c.NotebookApp.enable_mathjax = True
  • 启动Jupyter

    $ nohup jupyter notebook --allow-root & 
    # nohup避免关闭终端则终止了Jupyter 程序的运行,--allow-root允许root权限,& 将程序放入后台运行
  • 打开端口步骤: 本实例安全组->配置规则->入方向->手动添加

授权策略 优先级 协议类型 端口范围 授权对象
允许 100 自定义 TCP 目的:8888/8888 源:0.0.0.0/0
  • 浏览器访问Jupyter notebook(移动端或桌面端),并输入刚才配置的密码即可使用
    http://HostIP:8888
    http://域名:8888

注意

  1. 第二种方式需要域名解析到服务器公网IP,域名等价于公网IP
  2. https://HostIP:8888访问出错,https://域名:8888同理
  • anaconda换源,分别测试一下下载速度和稳定性,自行选择最优的

    # 添加清华源
    $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    $ $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge 
    $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
    $ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
    
    # 添加上交源
    $ conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/ 
    $ conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
    $ conda config --add channels https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/ 
    
    # 添加中科大源
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge/
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/msys2/
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda/
    $ conda config --add channels https://mirrors.ustc.edu.cn/anaconda/cloud/menpo/
    
    # 设置搜索时显示通道地址 有资源显示源地址
    $ conda config --set show_channel_urls yes
    
    # 换回默认源(重置用)
    $ conda config --remove-key channels
  • 可以在Jupyter notebook的工作目录中上传或下载.ipynb文件,当然别的文件也可以。

nginx重定向

希望在我的博客中添加一个菜单按钮直接访问我的Jupyter notebook。然而菜单链接是通过url_for自动生成的,如添加link: ':8888',生成的是pxxyyz.com/:8888/,而不是pxxyyz.com:8888。当然,可以设置链接为link: 'pxxyyz.com:8888',直接且简单,但这不能学到一些有趣的东西!

下面通过特点子页面来访问域名的指定端口,即通过pxxyyz.com/jupyter访问pxxyyz.com:8888

  • 在此之前上传了SSL证书并配置HTTPS2
  • 修改服务器配置文件

    $ vim /etc/nginx/nginx.conf
  • i 键进入文件的编辑模式,在该文件找到server,修改代码,按 Esc 键退出编辑模式,输入:wq 保存退出。(先输入:,然后输入wq回车)

  server {
      listen       443 ssl;# 80 default_server;
      # listen       [::]:80 default_server;
      server_name  pxxyyz.com;
      root         /home/hexo;
      # ssl on; # 老版本指令
      ssl_certificate /etc/nginx/conf/XXXXbundle.crt;
      ssl_certificate_key /etc/nginx/conf/XXXX.key;
      ssl_session_timeout 5m;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4!DHE;
      ssl_prefer_server_ciphers on;

      # Load configuration files for the default server block.
      include /etc/nginx/default.d/*.conf;

      location / {
      }

# http://pxxyyz.com/jupyter/ to http://pxxyyz.com:8888
      location ~ /jupyter/?$ {
        return 302 http://pxxyyz.com:8888;
      }
      
      error_page 404 /404.html;
          location = /40x.html {
      }

      error_page 500 502 503 504 /50x.html;
          location = /50x.html {
      }
  }
  server { #把http的域名请求转成https
      listen 80;
      server_name pxxyyz.com;
      return 301 https://$host$request_uri;
  }
  • 重启nginx 并检查配置

    $ service nginx restart
    # systemctl restart nginx.service
    $ nginx -t
    
    # 得到结果是
    # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    # nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 当然,一开始不是这么做的,错误的方法也贴出来,避免入坑

    server {
        listen 80;
        server_name pxxyyz.com;
        location /jupyter {
              proxy_pass http://pxxyyz.com:8888/tree?
         }
      }
  • 分析

    • proxy_pass得到的重定向是https://pxxyyz.com/jupyter
    • 对应的服务器访问的是https://HostIP:8888
    • 正确的Jupyter notebook访问地址却是http://HostIP:8888
    • 因此问题出在http的域名强制转成https
    • 解决方法:遇到指定链接用return 302返回http从而得到正确的结果3
    • 结果:
      • https://pxxyyz.com/jupyterhttp://pxxyyz.com/jupyterhttp://pxxyyz.com:8888http://HostIP:8888均能打开Jupyter notebook
      • IP的SSL证书不免费https+port的组合访问会出错。

参考


-[1] 搭建 ipython/jupyter notebook 服务器


-[2] hexo部署服务器之配置HTTPS


-[3] NGINX rewrite location to another port


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!